cs-project-svn_notify Mailing List for CS-Project (Page 2)
Brought to you by:
crazedsanity
You can subscribe to this list here.
2007 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(65) |
Dec
(47) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2008 |
Jan
(34) |
Feb
(82) |
Mar
(21) |
Apr
(12) |
May
(16) |
Jun
|
Jul
(6) |
Aug
(8) |
Sep
|
Oct
|
Nov
|
Dec
|
2009 |
Jan
(1) |
Feb
(52) |
Mar
|
Apr
|
May
|
Jun
|
Jul
(9) |
Aug
(5) |
Sep
(12) |
Oct
(11) |
Nov
(4) |
Dec
(15) |
2010 |
Jan
|
Feb
|
Mar
(6) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2011 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(9) |
2012 |
Jan
(2) |
Feb
|
Mar
|
Apr
|
May
|
Jun
(1) |
Jul
|
Aug
|
Sep
(1) |
Oct
|
Nov
|
Dec
|
From: <cra...@us...> - 2009-12-14 16:16:46
|
Revision: 1016 http://cs-project.svn.sourceforge.net/cs-project/?rev=1016&view=rev Author: crazedsanity Date: 2009-12-14 16:16:39 +0000 (Mon, 14 Dec 2009) Log Message: ----------- Remove code dir. Removed Paths: ------------- trunk/2.0/code/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cra...@us...> - 2009-12-14 16:14:33
|
Revision: 1015 http://cs-project.svn.sourceforge.net/cs-project/?rev=1015&view=rev Author: crazedsanity Date: 2009-12-14 16:14:25 +0000 (Mon, 14 Dec 2009) Log Message: ----------- Rename code to public_html: not going to setup initially to be installable as a subfolder in an existing website (see last commit). Added Paths: ----------- trunk/2.0/public_html/ Removed Paths: ------------- trunk/2.0/code/images/ trunk/2.0/code/includes/ trunk/2.0/code/js/ trunk/2.0/public_html/lib/ trunk/2.0/public_html/templates/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cra...@us...> - 2009-12-14 16:12:15
|
Revision: 1014 http://cs-project.svn.sourceforge.net/cs-project/?rev=1014&view=rev Author: crazedsanity Date: 2009-12-14 16:12:07 +0000 (Mon, 14 Dec 2009) Log Message: ----------- Move stuff around, not bothering with setting up to be installable as a subfolder of existing site (can provide instructions for this later: consider it an "advanced setup"). Added Paths: ----------- trunk/2.0/lib/ trunk/2.0/templates/ Removed Paths: ------------- trunk/2.0/code/lib/ trunk/2.0/code/templates/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cra...@us...> - 2009-12-14 15:37:05
|
Revision: 1013 http://cs-project.svn.sourceforge.net/cs-project/?rev=1013&view=rev Author: crazedsanity Date: 2009-12-14 15:36:59 +0000 (Mon, 14 Dec 2009) Log Message: ----------- Test script and externals property. Added Paths: ----------- trunk/2.0/code/includes/ajax/ trunk/2.0/code/includes/ajax/test.inc Property Changed: ---------------- trunk/2.0/code/lib/ Added: trunk/2.0/code/includes/ajax/test.inc =================================================================== --- trunk/2.0/code/includes/ajax/test.inc (rev 0) +++ trunk/2.0/code/includes/ajax/test.inc 2009-12-14 15:36:59 UTC (rev 1013) @@ -0,0 +1,14 @@ +<?php +/* + * Created on Dec 14, 2009 + * + * SVN INFORMATION::: + * ------------------- + * Last Author::::::::: $Author$ + * Current Revision:::: $Revision$ + * Repository Location: $HeadURL$ + * Last Updated:::::::: $Date$ + */ + + +?> Property changes on: trunk/2.0/code/lib ___________________________________________________________________ Added: svn:externals + cs-content https://cs-content.svn.sourceforge.net/svnroot/cs-content/trunk/1.0 cs-phpxml https://cs-phpxml.svn.sourceforge.net/svnroot/cs-phpxml/trunk/1.0 cs-webapplibs https://cs-webapplibs.svn.sourceforge.net/svnroot/cs-webapplibs/trunk/0.3 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cra...@us...> - 2009-12-14 15:31:59
|
Revision: 1012 http://cs-project.svn.sourceforge.net/cs-project/?rev=1012&view=rev Author: crazedsanity Date: 2009-12-14 15:31:52 +0000 (Mon, 14 Dec 2009) Log Message: ----------- jQuery and basic js for project. Added Paths: ----------- trunk/2.0/code/js/cs-project.js trunk/2.0/code/js/jquery-1.3.2.min.js Added: trunk/2.0/code/js/cs-project.js =================================================================== --- trunk/2.0/code/js/cs-project.js (rev 0) +++ trunk/2.0/code/js/cs-project.js 2009-12-14 15:31:52 UTC (rev 1012) @@ -0,0 +1,371 @@ + + + +function toggleDisplay(obj) { + if(obj != null) { + //check if "obj" is an object or just a string. + if(obj != null && typeof(obj) == 'object') { + var el = obj; + } + else { + var el = document.getElementById(obj); + } + + var oldDisplay = el.style.display; + + + if(oldDisplay == 'none') { + var newDisplay = 'inline'; + } + else { + var newDisplay = 'none'; + } + + el.style.display = newDisplay; + } +} + + +/** + * Works simply by having 2 divs and an input with standardized + * prefixes, and having special suffixes so it's easy to call + * without having to pass the names of the three elements. +**/ +function enableInput(prefixName) { + //set the names of the items. + var inputObjName = prefixName + '_input'; + var textDivName = prefixName + '_text'; + var inputDivName = prefixName + '_inputDiv'; + + + + if(document.getElementById(inputDivName)) { + //make the text disappear. + toggleDisplay(textDivName, 'inline'); + } + + if(document.getElementById(inputDivName)) { + //make the input div appear. + //toggleDisplay(inputDivName, 'inline'); + new Effect.Appear(inputDivName); + } + + //now enable the input. + if(document.getElementById(inputObjName) != null) { + var inputObj = document.getElementById(inputObjName); + inputObj.disabled = false; + inputObj.style.display = 'inline'; + } +} + +/** + * Hide the text div & enable one of two divs. +**/ +function setup__enableInput(prefixName, selectedOption) { + + //EXAMPLE: if "prefixName"=="example" and "selectedOption"=="option1"... + + //example_text + var textDivName = prefixName + '_text'; + + //example_option1_div + var optionDivName = prefixName + '_' + selectedOption + '_div'; + + //example_option1_submitButton + var submitButtonName = prefixName + '_' + selectedOption +'_submitButton'; + + //example_selectedOption + var selectedOptionName = prefixName + '_selectedOption'; + + //hide the text. + var textDiv = document.getElementById(textDivName); + textDiv.style.display = 'none'; + + //display the option. + var optionDiv = document.getElementById(optionDivName); + optionDiv.style.display = 'inline'; + + //set the value of the option input. + var selectedOptionInput = document.getElementById(selectedOptionName); + selectedOptionInput.value = selectedOption; + + //display the submit button. + var submitButton = document.getElementById(submitButtonName); + submitButton.style.display = 'inline'; +} + + +function cs_addAttribute(selectObj) { + if(selectObj != null && selectObj.selectedIndex > 0) { + //okay, get the value... + var myValue = selectObj.options[selectObj.selectedIndex].value; + var valueInputObj = document.getElementById('addAttribute_value'); + + if(myValue.length > 0) { + //okay... + if(myValue == '**new**') { + toggleDisplay('addAttribute_select', 'inline'); + toggleDisplay('addAttribute_new', 'inline'); + document.getElementById('addAttribute_list').disabled=true; + document.getElementById('addAttribute_new_input').disabled=false; + } + else { + document.getElementById('addAttribute_new_input').value = myValue; + document.getElementById('addAttribute_new_input').disabled=false; + } + valueInputObj.disabled = false; + cs_enableSubmitButton(); + } + else { + valueInputObj.disabled = true; + } + } +}//end cs_addAttribute() + + +function cs_contactDelAttrib(checkBoxObj) { + if(checkBoxObj != null) { + var myName = checkBoxObj.value; + var inputName = 'editAttribute_' + myName; + var enableInputObj = document.getElementById(inputName); + + if(enableInputObj != null) { + cs_enableSubmitButton(); + enableInputObj.disabled = true; + } + else { + alert("Cannot find input with id=(" + inputName + ")"); + } + } +}//end cs_contactDelAttrib() + + +function cs_contactEdit() { + //form appears, static data disappears. + toggleDisplay('mainContact_static', 'inline'); + toggleDisplay('mainContact_form', 'inline'); + + //now enable some elements. + document.getElementById('contactData_company').disabled=false; + document.getElementById('contactData_fname').disabled=false; + document.getElementById('contactData_lname').disabled=false; + document.getElementById('contactData_email').disabled=false; + cs_enableSubmitButton(); +}//end cs_contactEdit() + + +function cs_enableSubmitButton(buttonName, disVal) { + if(buttonName != null) { + var buttonObj = document.getElementById(buttonName); + } + else { + var buttonObj = document.getElementById('submitButton'); + } + + //if(disVal == null || (disVal != true && disVal != false)) { + // disVal = false; + //} + + if(buttonObj != null && buttonObj.type == 'submit') { + buttonObj.disabled = disVal; + } + + return(disVal); +}//end cs_enableSubmitButton() + + +function cs_attributeEdit(myName) { + var linkDivObj = document.getElementById('link_editAttribute_' + myName); + var inputDivObj = document.getElementById('input_editAttribute_' + myName); + var inputObj = document.getElementById('editAttribute_' + myName); + + if(linkDivObj != null && inputDivObj != null && inputObj != null) { + linkDivObj.style.display = 'none'; + inputDivObj.style.display = 'inline'; + inputObj.disabled = false; + cs_enableSubmitButton(); + } + +}//end cs_attributeEdit() + + +function cs_setContactEmailId(newValue) { + var inputObj = document.getElementById('contactData_email'); + + if(inputObj != null && newValue != null) { + inputObj.value = newValue; + + //reset the old fontWeight... + myObj = null; + var checkBoxes = updateContactForm.garbage_contactEmailId; + for(counter = 0; counter < checkBoxes.length; counter++) { + curValue = checkBoxes[counter].value; + myName = 'display_ceid_' + curValue; + myObj = document.getElementById(myName); + + if(myObj != null) { + if(curValue == newValue) { + myObj.style.fontWeight = 'bold'; + } + else { + myObj.style.fontWeight = 'normal'; + } + } + } + } +}//end cs_setContactEmailId() + + +function cs_contactAddEmail(obj) { + var newEmailObj = document.getElementById('contactData_newContactEmail'); + + newEmailObj.disabled = false; + + if(obj != null) { + //passed the object: they want the value updated. + newEmailObj.value = obj.value; + cs_setContactEmailId('new'); + } + else { + var linkDivObj = document.getElementById('contactAddEmail_link'); + var radioDivObj = document.getElementById('contactAddEmail_radioDiv'); + var radioInputObj = document.getElementById('contactAddEmail_radio'); + var textDivObj = document.getElementById('contactAddEmail_text'); + var textInputObj = document.getElementById('contactAddEmail_input'); + + linkDivObj.style.display = 'none'; + radioDivObj.style.display = 'inline'; + textDivObj.style.display = 'inline'; + + textInputObj.disabled = false; + radioInputObj.disabled = false; + radioInputObj.checked = true; + } + + +}//end cs_contactAddEmail() + + +/** + * The data inside the given div is replaced... + */ +function cs_submitButton_processing(buttonDivName) { + + var buttonDivObj = document.getElementById(buttonDivName + '_button'); + var imageDivObj = document.getElementById(buttonDivName + '_image'); + + if(buttonDivObj != null && imageDivObj != null) { + //buttonDivObj.style.display = 'none'; + //imageDivObj.style.display = 'inline'; + + toggleDisplay(buttonDivObj, 'none'); + toggleDisplay(imageDivObj, 'inline'); + } + else { + alert("at least one object is null::: " + buttonDivObj + imageDivObj); + } + +}//end cs_submitButton_processing() + + +function lostPassword_validate() { + //document.print("checking... " + time()); + //var dateObj = new Date(); + //document.write("checking... " + dateObj.getMilliseconds()); + //clearInterval(); + + var hashObj = document.getElementById('hashInput'); + var checksumObj = document.getElementById('checksumInput'); + var debugObj = document.getElementById('debug'); + + var buttonShouldBe = ""; + var enableVal = ""; + var showEnableVal = ""; + var passMatchText = "not checked..."; + var passMatch = false; + + var passCheckObj = document.getElementById('password'); + var passConfirmObj = document.getElementById('passwordConfirm'); + + //alert(hashObj.toString()); + + if(hashObj != null && checksumObj != null && passCheckObj != null && passConfirmObj != null) { + + passMatchText = "do not match"; + passMatch = false; + if(passCheckObj.value == passConfirmObj.value) { + passMatchText = "<b>match</b>"; + passMatch = true; + } + + //check that the hash is 32 characters long. + if(hashObj.value.length == 32 && checksumObj.value.length > 3 && passMatch == true) { + buttonShouldBe = 'enabled'; + enableVal = cs_enableSubmitButton(); + } + else { + buttonShouldBe = 'DISabled'; + enableVal = cs_enableSubmitButton(null, true); + } + + showEnableVal = "FALSE"; + if(enableVal == true) { + showEnableVal = "true"; + } + } + + debugObj.innerHTML = "HASH VALUE: " + hashObj.value + "<br>\nLENGTH: " + hashObj.value.length + + "<hr>checksum Value: " + checksumObj.value + "<br>\nLENGTH: " + checksumObj.value.length + + "<hr>Button should be: " + buttonShouldBe + "<br>\nButton REALLY IS " + enableVal + + "<hr>Passwords: " + passMatchText; + + //debugObj.innerHTML = info + hashObj.toString(); + //clearInterval(); + +}//end lostPassword_validate() + + +function cs_confirmLostPass() { + cs_submitButton_processing('submitRequest'); + var hashInputObj = document.getElementById('hashInput'); + var checksumInputObj = document.getElementById('checksumInput'); + + hashInputObj.readonly = true; + checksumInputObj.readonly = true; +}//end cs_confirmLostPass() + + +function clearErrorMessage() { + var name = 'MAIN_error_message'; + document.getElementById(name).innerHTML=""; +}//end clearErrorMessage() + + +/** + * Overload the xajax call to be able to do things like clearing out the + * div that contains set messages... + */ +function checkAjax() { + var retval = false; + if(this.xajaxLoaded) { + retval = true; + } + return retval; +} +var clearMessageTimeoutID; +if(checkAjax()) { + //keep around the old call function + xajax.realCall = xajax.call; + //override the call function to bend to our wicked ways + xajax.call = function(sFunction, aArgs, sRequestType) + { + //clear out the message. + if(this.clearMessageTimeoutID) { + clearTimeout(this.clearMessageTimeoutID); + } + this.clearMessageTimeoutID = setTimeout("clearErrorMessage();", 10000); + + //call the old call function + return this.realCall(sFunction, aArgs, sRequestType); + } +} \ No newline at end of file Added: trunk/2.0/code/js/jquery-1.3.2.min.js =================================================================== --- trunk/2.0/code/js/jquery-1.3.2.min.js (rev 0) +++ trunk/2.0/code/js/jquery-1.3.2.min.js 2009-12-14 15:31:52 UTC (rev 1012) @@ -0,0 +1,19 @@ +/* + * jQuery JavaScript Library v1.3.2 + * http://jquery.com/ + * + * Copyright (c) 2009 John Resig + * Dual licensed under the MIT and GPL licenses. + * http://docs.jquery.com/License + * + * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) + * Revision: 6246 + */ +(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}}); +/* + * Sizzle CSS Selector Engine - v0.9.3 + * Copyright 2009, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML=' <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/... [truncated message content] |
From: <cra...@us...> - 2009-12-14 15:28:57
|
Revision: 1011 http://cs-project.svn.sourceforge.net/cs-project/?rev=1011&view=rev Author: crazedsanity Date: 2009-12-14 15:28:48 +0000 (Mon, 14 Dec 2009) Log Message: ----------- Remove old "frame" folder (part of the template for displaying messages/errors). Removed Paths: ------------- trunk/2.0/code/images/frame/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cra...@us...> - 2009-12-14 15:25:42
|
Revision: 1010 http://cs-project.svn.sourceforge.net/cs-project/?rev=1010&view=rev Author: crazedsanity Date: 2009-12-14 15:25:34 +0000 (Mon, 14 Dec 2009) Log Message: ----------- Incorrectly named images folder when copying from 1.2.x Added Paths: ----------- trunk/2.0/code/images/ Removed Paths: ------------- trunk/2.0/code/public_html/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cra...@us...> - 2009-12-14 15:23:36
|
Revision: 1009 http://cs-project.svn.sourceforge.net/cs-project/?rev=1009&view=rev Author: crazedsanity Date: 2009-12-14 15:23:28 +0000 (Mon, 14 Dec 2009) Log Message: ----------- Images from 1.2.x Added Paths: ----------- trunk/2.0/code/public_html/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cra...@us...> - 2009-12-14 15:21:33
|
Revision: 1008 http://cs-project.svn.sourceforge.net/cs-project/?rev=1008&view=rev Author: crazedsanity Date: 2009-12-14 15:21:27 +0000 (Mon, 14 Dec 2009) Log Message: ----------- Initial folder structure. Built to run as either the entirety of a website or from a subfolder. Added Paths: ----------- trunk/2.0/code/ trunk/2.0/code/includes/ trunk/2.0/code/js/ trunk/2.0/code/lib/ trunk/2.0/code/templates/ Property Changed: ---------------- trunk/2.0/ Property changes on: trunk/2.0 ___________________________________________________________________ Added: svn:ignore + .project This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cra...@us...> - 2009-12-14 02:05:21
|
Revision: 1007 http://cs-project.svn.sourceforge.net/cs-project/?rev=1007&view=rev Author: crazedsanity Date: 2009-12-14 02:05:10 +0000 (Mon, 14 Dec 2009) Log Message: ----------- Images for the Pencil documents, and som updates to the files and stuff. Modified Paths: -------------- trunk/2.0/docs/CS-Project Database Design.xmind trunk/2.0/docs/natural_URLs.doc Added Paths: ----------- trunk/2.0/docs/CS-Project_Ideas.xmind trunk/2.0/docs/images/ trunk/2.0/docs/images/bug.gif trunk/2.0/docs/images/check_green.gif trunk/2.0/docs/images/check_red.gif trunk/2.0/docs/images/check_yellow.gif trunk/2.0/docs/images/checkmark__whitebg-blueopenbox-greencheck.jpeg trunk/2.0/docs/images/checkmark__whitebg-greencheck.jpeg trunk/2.0/docs/images/checkmark__whitebg-greencircle-whitecheck-3d.jpeg trunk/2.0/docs/images/checkmark__whitebg-greencircle-whitecheck.jpeg trunk/2.0/docs/images/close.gif trunk/2.0/docs/images/cs-project_logo.gif trunk/2.0/docs/images/exclamation.gif trunk/2.0/docs/images/exclamation__black-yellowgradientcircle.jpeg trunk/2.0/docs/images/exclamation__black-yellowgradienttriangle.jpeg trunk/2.0/docs/images/feature_request.gif trunk/2.0/docs/images/firefox_navigation_screenshot.png trunk/2.0/docs/images/icon-help.png trunk/2.0/docs/images/logout__blacktext-grayperson.jpeg trunk/2.0/docs/images/logout__graytext-leftcurlarrow.jpeg trunk/2.0/docs/images/logout__redtext-whitebg-personopendoor.jpeg trunk/2.0/docs/images/logout__whitetext-grayroundbg-whitearrowright.jpeg trunk/2.0/docs/images/logouter__blacktext-redsquare-powersymbol.jpeg trunk/2.0/docs/images/open.gif trunk/2.0/docs/images/red_x.gif trunk/2.0/docs/images/user_add.jpeg trunk/2.0/docs/images/user_remove.jpeg Property Changed: ---------------- trunk/2.0/docs/ Property changes on: trunk/2.0/docs ___________________________________________________________________ Added: svn:ignore + .directory *.tmp .~* Modified: trunk/2.0/docs/CS-Project Database Design.xmind =================================================================== (Binary files differ) Added: trunk/2.0/docs/CS-Project_Ideas.xmind =================================================================== (Binary files differ) Property changes on: trunk/2.0/docs/CS-Project_Ideas.xmind ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/2.0/docs/images/bug.gif =================================================================== (Binary files differ) Property changes on: trunk/2.0/docs/images/bug.gif ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/2.0/docs/images/check_green.gif =================================================================== (Binary files differ) Property changes on: trunk/2.0/docs/images/check_green.gif ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/2.0/docs/images/check_red.gif =================================================================== (Binary files differ) Property changes on: trunk/2.0/docs/images/check_red.gif ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/2.0/docs/images/check_yellow.gif =================================================================== (Binary files differ) Property changes on: trunk/2.0/docs/images/check_yellow.gif ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/2.0/docs/images/checkmark__whitebg-blueopenbox-greencheck.jpeg =================================================================== (Binary files differ) Property changes on: trunk/2.0/docs/images/checkmark__whitebg-blueopenbox-greencheck.jpeg ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/2.0/docs/images/checkmark__whitebg-greencheck.jpeg =================================================================== (Binary files differ) Property changes on: trunk/2.0/docs/images/checkmark__whitebg-greencheck.jpeg ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/2.0/docs/images/checkmark__whitebg-greencircle-whitecheck-3d.jpeg =================================================================== (Binary files differ) Property changes on: trunk/2.0/docs/images/checkmark__whitebg-greencircle-whitecheck-3d.jpeg ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/2.0/docs/images/checkmark__whitebg-greencircle-whitecheck.jpeg =================================================================== (Binary files differ) Property changes on: trunk/2.0/docs/images/checkmark__whitebg-greencircle-whitecheck.jpeg ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/2.0/docs/images/close.gif =================================================================== (Binary files differ) Property changes on: trunk/2.0/docs/images/close.gif ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/2.0/docs/images/cs-project_logo.gif =================================================================== (Binary files differ) Property changes on: trunk/2.0/docs/images/cs-project_logo.gif ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/2.0/docs/images/exclamation.gif =================================================================== (Binary files differ) Property changes on: trunk/2.0/docs/images/exclamation.gif ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/2.0/docs/images/exclamation__black-yellowgradientcircle.jpeg =================================================================== (Binary files differ) Property changes on: trunk/2.0/docs/images/exclamation__black-yellowgradientcircle.jpeg ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/2.0/docs/images/exclamation__black-yellowgradienttriangle.jpeg =================================================================== (Binary files differ) Property changes on: trunk/2.0/docs/images/exclamation__black-yellowgradienttriangle.jpeg ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/2.0/docs/images/feature_request.gif =================================================================== (Binary files differ) Property changes on: trunk/2.0/docs/images/feature_request.gif ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/2.0/docs/images/firefox_navigation_screenshot.png =================================================================== (Binary files differ) Property changes on: trunk/2.0/docs/images/firefox_navigation_screenshot.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/2.0/docs/images/icon-help.png =================================================================== (Binary files differ) Property changes on: trunk/2.0/docs/images/icon-help.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/2.0/docs/images/logout__blacktext-grayperson.jpeg =================================================================== (Binary files differ) Property changes on: trunk/2.0/docs/images/logout__blacktext-grayperson.jpeg ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/2.0/docs/images/logout__graytext-leftcurlarrow.jpeg =================================================================== (Binary files differ) Property changes on: trunk/2.0/docs/images/logout__graytext-leftcurlarrow.jpeg ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/2.0/docs/images/logout__redtext-whitebg-personopendoor.jpeg =================================================================== (Binary files differ) Property changes on: trunk/2.0/docs/images/logout__redtext-whitebg-personopendoor.jpeg ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/2.0/docs/images/logout__whitetext-grayroundbg-whitearrowright.jpeg =================================================================== (Binary files differ) Property changes on: trunk/2.0/docs/images/logout__whitetext-grayroundbg-whitearrowright.jpeg ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/2.0/docs/images/logouter__blacktext-redsquare-powersymbol.jpeg =================================================================== (Binary files differ) Property changes on: trunk/2.0/docs/images/logouter__blacktext-redsquare-powersymbol.jpeg ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/2.0/docs/images/open.gif =================================================================== (Binary files differ) Property changes on: trunk/2.0/docs/images/open.gif ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/2.0/docs/images/red_x.gif =================================================================== (Binary files differ) Property changes on: trunk/2.0/docs/images/red_x.gif ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/2.0/docs/images/user_add.jpeg =================================================================== (Binary files differ) Property changes on: trunk/2.0/docs/images/user_add.jpeg ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/2.0/docs/images/user_remove.jpeg =================================================================== (Binary files differ) Property changes on: trunk/2.0/docs/images/user_remove.jpeg ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Modified: trunk/2.0/docs/natural_URLs.doc =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cra...@us...> - 2009-11-30 20:11:32
|
Revision: 1006 http://cs-project.svn.sourceforge.net/cs-project/?rev=1006&view=rev Author: crazedsanity Date: 2009-11-30 20:11:24 +0000 (Mon, 30 Nov 2009) Log Message: ----------- Prototypes using "Pencil" (a.k.a. "Pencil Sketchin"), an add-in to Firefox or standalone. Added Paths: ----------- trunk/2.0/docs/CS-Project Redesign -- Helpdesk - Existing Issue.png trunk/2.0/docs/CS-Project__redesign-active_project-summary.ep trunk/2.0/docs/CS-Project__redesign-active_project.ep trunk/2.0/docs/CS-Project__redesign-helpdesk.ep Added: trunk/2.0/docs/CS-Project Redesign -- Helpdesk - Existing Issue.png =================================================================== (Binary files differ) Property changes on: trunk/2.0/docs/CS-Project Redesign -- Helpdesk - Existing Issue.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/2.0/docs/CS-Project__redesign-active_project-summary.ep =================================================================== --- trunk/2.0/docs/CS-Project__redesign-active_project-summary.ep (rev 0) +++ trunk/2.0/docs/CS-Project__redesign-active_project-summary.ep 2009-11-30 20:11:24 UTC (rev 1006) @@ -0,0 +1,379 @@ +<?xml version="1.0"?> +<Document xmlns="http://www.evolus.vn/Namespace/Pencil"><Properties/><Pages><Page><Properties><Property name="name">Summary (Active Project)</Property><Property name="id">1221681443371_3572</Property><Property name="width">1242</Property><Property name="height">782</Property><Property name="dimBackground">false</Property></Properties><Content><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.WindowsXP.Widgets:Frame" transform="matrix(1, 0, 0, 1, 10, 5)" p:locked="true"><p:metadata><p:property name="box"><![CDATA[1010,620]]></p:property><p:property name="withClose"><![CDATA[true]]></p:property><p:property name="withMax"><![CDATA[true]]></p:property><p:property name="withMin"><![CDATA[true]]></p:property><p:property name="withShadow"><![CDATA[false]]></p:property><p:property name="titleText"><![CDATA[CS-Project - Mozilla Firefox]]></p:property><p:property name="textColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="textFont"><![CDATA[Trebuchet MS|bold|normal|13px|none]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property><p:property name="withRoomForIcon"><![CDATA[false]]></p:property></p:metadata> + <defs> + <pattern patternUnits="userSpaceOnUse" x="0" y="0" width="1" height="29" p:name="titlePattern" id="titlePattern11221489040866778645"> + <image image-rendering="optimizeQuality" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAdCAYAAABrAQZpAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9gBEAohNhFyT2EAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAXklEQVQI123KsRHCMBAAwfuTRAW04z5cOjEhjB1AYMaW/CSEJBstzM90mq64HuDtDvJ+4dgOpO/ISCRPJETgDw0pgVCQUjFawaRiVDAu7ZejBmZPjLPj+CSyPDC2hS8XER5NU5DfKgAAAABJRU5ErkJggg==" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" width="1" height="29"/> + </pattern> + <image xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAdCAYAAACXFC2jAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A /wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9gBEAoOIhm0o3EAAAAZdEVYdENv bW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAABW0lEQVQoz3WSS0sDQRCEv+555Ama3ASPXrwK Qn6Fv88fqKAo+EpC1t3Z9rCzjyRrw8AyXdPVVbXCwyNnle5NxAHgh/dSbwwgXN8gixnLqfYAqTcm qyv8fEEVEkFlMOHnzuxije2/KKcKBRTlB8URRfkG8zW22/acforydGvM1s1FUfYHoDqgALw8wz4h xf5MkPL9zP8VULYhj1OkYGTCoGqdNB+TAATwLgMsgEZwAinCrwcc1IqiK4gBqmyLExA9obAJhHm2 NDdNzndoghpeueOwiBEmmcK1WcRls2CcggikvAcCXkconIBvmphHsTmEzDQkNI9I60PtO2vxAi7m Bx7Ft80IVd9sf7l+h5AgOy3iUBFEQKmqjMv2dis4xAlKmY5EtK9H0+xSNUOqNA6wwURL1iqvj0GH guQ8zsqTLHa7Rol3kCClMAB87uASeH2H6JBO5mnFLNUMM/gDasVk7m2cE34AAAAASUVORK5CYII= " xmlns:xlink="http://www.w3.org/1999/xlink" width="8" height="29" p:name="cornerImage" id="cornerImage11221489040866778645"/> + + <linearGradient x1="0%" y1="0%" x2="100%" y2="100%" p:name="closeButtonFill" id="closeButtonFill11221489040866778645"> + <stop style="stop-color: rgb(239, 163, 144); stop-opacity: 1;" offset="0"/> + <stop style="stop-color: rgb(224, 56, 2); stop-opacity: 1;" offset="1"/> + </linearGradient> + <linearGradient x1="0%" y1="0%" x2="100%" y2="100%" p:name="otherButtonFill" id="otherButtonFill11221489040866778645"> + <stop style="stop-color: rgb(154, 183, 250); stop-opacity: 1;" offset="0"/> + <stop style="stop-color: rgb(0, 69, 211); stop-opacity: 1;" offset="1"/> + </linearGradient> + <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="shadingFilter11221489040866778645"> + <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/> + </filter> + </defs> + <rect x="0" y="5" width="1010" height="615" transform="translate(2, 2)" p:filter="url(#shadingFilter11221489040866778645)" style="stroke: none; opacity: 0.6; fill-opacity: 1; fill: rgb(0, 0, 0); visibility: hidden;" p:name="bgRect" id="bgRect11221489040866778645"/> + <rect x="1.5" y="25.5" style="fill: rgb(236, 233, 216); stroke: rgb(0, 85, 229); stroke-width: 3px;" p:name="bodyRect" id="bodyRect11221489040866778645" width="1007" height="593"/> + <use xlink:href="#cornerImage11221489040866778645" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0"/> + <rect x="8" y="0" width="994" height="29" style="stroke: none; fill: url(#titlePattern11221489040866778645) rgb(0, 0, 0);" p:name="titleRect" id="titleRect11221489040866778645"/> + <use xlink:href="#cornerImage11221489040866778645" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" transform="translate(1010) scale(-1, 1)" p:name="titleCorner" id="titleCorner11221489040866778645"/> + <text x="9" y="16" style="font-size: 13px; font-style: normal; font-weight: bold; text-align: left; text-anchor: start; dominant-baseline: central; fill: rgb(10, 24, 131); font-family: Trebuchet MS; fill-opacity: 1; text-decoration: none;" xml:space="preserve" p:name="shadowText" id="shadowText11221489040866778645">CS-Project - Mozilla Firefox</text><path id="shadowText11221489040866778_underline645" style="fill: none; stroke-width: 1px; visibility: hidden;"/><path id="shadowText11221489040866_underline778645" style="fill: none; stroke-width: 1px; visibility: hidden;"/> + <text x="8" y="15" style="font-size: 13px; font-style: normal; font-weight: bold; text-align: left; text-anchor: start; dominant-baseline: central; fill: rgb(255, 255, 255); font-family: Trebuchet MS; fill-opacity: 1; text-decoration: none;" xml:space="preserve" p:name="text" id="text11221489040866778645">CS-Project - Mozilla Firefox</text><path id="text11221489040866778_underline645" style="fill: none; stroke-width: 1px; visibility: hidden;"/><path id="text11221489040866_underline778645" style="fill: none; stroke-width: 1px; visibility: hidden;"/> + <g p:name="closeButton" id="closeButton11221489040866778645" transform="translate(983)" style="visibility: visible;"> + <rect x="0.5" y="5.5" width="20" height="20" rx="2" ry="2" style="stroke: rgb(255, 255, 255); stroke-width: 1px; fill: url(#closeButtonFill11221489040866778645) rgb(0, 0, 0);"/> + <path d="M 6,11 L 15,20" style="stroke: rgb(255, 255, 255); stroke-width: 2px; fill: none;"/> + <path d="M 6,20 L 15,11" style="stroke: rgb(255, 255, 255); stroke-width: 2px; fill: none;"/> + </g> + <g p:name="maxButton" id="maxButton11221489040866778645" transform="translate(960)" style="visibility: visible;"> + <rect x="0.5" y="5.5" width="20" height="20" rx="2" ry="2" style="stroke: rgb(255, 255, 255); stroke-width: 1px; fill: url(#otherButtonFill11221489040866778645) rgb(0, 0, 0);"/> + <rect x="0" y="0" width="10" height="10" transform="translate(5.5, 10.5)" style="stroke: rgb(255, 255, 255); stroke-width: 1px; fill: none;"/> + <path d="M 0,1.5 L 10,1.5" transform="translate(5.5, 10.5)" style="stroke: rgb(255, 255, 255); stroke-width: 2px; fill: none;"/> + </g> + <g p:name="minButton" id="minButton11221489040866778645" transform="translate(937)" style="visibility: visible;"> + <rect x="0.5" y="5.5" width="20" height="20" rx="2" ry="2" style="stroke: rgb(255, 255, 255); stroke-width: 1px; fill: url(#otherButtonFill11221489040866778645) rgb(0, 0, 0);"/> + <path d="M 0,1.5 L 9,1.5" transform="translate(5, 19)" style="stroke: rgb(255, 255, 255); stroke-width: 3px; fill: none;"/> + </g> + </g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil"><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.WindowsXP.Widgets:TextBox" transform="matrix(1, 0, 0, 1, 239, 37)"><p:metadata><p:property name="box"><![CDATA[705,20]]></p:property><p:property name="textContent"><![CDATA[http://project.cs/projects/cs-project/summary]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA[Tahoma|normal|normal|11px|none]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property><p:property name="status"><![CDATA[normal]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property></p:metadata> + + <rect width="704" height="19" x="0.5" y="0.5" style="overflow: visible; marker: none; opacity: 1; color: rgb(0, 0, 0); fill: rgb(255, 255, 255); fill-opacity: 1; fill-rule: nonzero; stroke: rgb(127, 157, 185); stroke-width: 1; stroke-linecap: square; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-dashoffset: 0pt; stroke-opacity: 1; visibility: visible; display: inline;" p:name="rect" id="rect11221499497043974"/> + <text x="5" y="10" style="text-align: left; text-anchor: start; dominant-baseline: central; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: Tahoma; font-size: 11px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="text11221499497043974">http://project.cs/projects/cs-project/summary</text><path id="text11221499497043974_underline" style="fill: none; stroke-width: 1px; visibility: hidden;"/><path id="text11221499497043_underline974" style="fill: none; stroke-width: 1px; visibility: hidden;"/> + </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bitmap" transform="matrix(1, 0, 0, 1, 14, 35)"><p:metadata><p:property name="box"><![CDATA[229,23]]></p:property><p:property name="imageData"><![CDATA[229,23,images/firefox_navigation_screenshot.png]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFF00]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[0|]]></p:property></p:metadata> + <defs> + <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="imageShading" id="imageShading21221499639179974"> + <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/> + </filter> + <g p:name="container" id="container21221499639179974"> + <rect style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 0pt; fill-opacity: 0;" p:name="bgRect" id="bgRect21221499639179974" width="229" height="23" transform="translate(0)"/> + <g p:name="imageContainer" id="imageContainer21221499639179974" transform="scale(1)"> + <image x="0" y="0" p:name="image" id="image21221499639179974" xlink:href="images/firefox_navigation_screenshot.png" xmlns:xlink="http://www.w3.org/1999/xlink" width="229" height="23"/> + </g> + </g> + </defs> + <use xlink:href="#container21221499639179974" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#imageShading21221499639179974)" style="opacity: 0.6; visibility: hidden;" p:name="bgCopy" id="bgCopy21221499639179974"/> + <use xlink:href="#container21221499639179974" xmlns:xlink="http://www.w3.org/1999/xlink"/> + </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.WindowsXP.Widgets:Seprator" transform="matrix(1, 0, 0, 1, 14, 55)"><p:metadata><p:property name="box"><![CDATA[1000,10]]></p:property><p:property name="type"><![CDATA[normal]]></p:property></p:metadata> + <rect style="fill: rgb(0, 0, 0); fill-opacity: 0; stroke: none;" x="0" y="0" p:name="bgRect" id="bgRect101221500462927974" width="1000" height="10"/> + <path style="fill: none; stroke: rgb(172, 168, 153); stroke-width: 1px;" d="M 0 5 L 1000 5" transform="translate(0.5, 0.5)" p:name="line1" id="line1101221500462927974"/> + <path style="fill: none; stroke: rgb(255, 255, 255); stroke-width: 1px; visibility: visible;" d="M 0 6 L 1000 6" transform="translate(0.5, 0.5)" p:name="line2" id="line2101221500462927974"/> + </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RichTextBox" transform="matrix(1, 0, 0, 1, 515, 120)"><p:metadata><p:property name="width"><![CDATA[150,0]]></p:property><p:property name="textContent"><![CDATA[<a _moz_dirty="" href="[object XULElement]"><span style="font-weight: bold;" _moz_dirty="">Update Preferences</span><br _moz_dirty=""/></a>]]></p:property><p:property name="textFont"><![CDATA[Arial|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata> + + <foreignObject x="0" y="0" width="150" height="15" p:name="text" id="text141221501019259480" style="font-family: Arial; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; color: rgb(0, 0, 0); opacity: 1;"><div xmlns="http://www.w3.org/1999/xhtml"><a _moz_dirty="" href="[object XULElement]"><span style="font-weight: bold;" _moz_dirty="">Update Preferences</span><br _moz_dirty=""/></a></div></foreignObject><path id="text141221501019259_underline480" style="fill: none; stroke-width: 1px; visibility: hidden;"/> + </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.WindowsXP.Widgets:Combo" transform="matrix(1, 0, 0, 1, 510, 90)"><p:metadata><p:property name="box"><![CDATA[179,20]]></p:property><p:property name="buttonText"><![CDATA[(*) CS-Project]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA[Tahoma|normal|normal|11px|none]]></p:property><p:property name="textAlign"><![CDATA[0,1]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="focused"><![CDATA[false]]></p:property></p:metadata> + + <defs p:name="defs2177" id="defs2177111221500506650833"> + <linearGradient x1="0%" y1="0%" x2="100%" y2="100%" p:name="linearGradient4129" id="linearGradient4129111221500506650833"> + <stop style="stop-color: rgb(231, 238, 255); stop-opacity: 1;" offset="0" p:name="stop1" id="stop1111221500506650833"/> + <stop style="stop-color: rgb(174, 200, 247); stop-opacity: 1;" offset="1" p:name="stop2" id="stop2111221500506650833"/> + </linearGradient> + </defs> + <rect width="178" height="19" x="0.5" y="0.5" style="opacity: 1; color: rgb(0, 0, 0); fill: rgb(255, 255, 255); fill-opacity: 1; fill-rule: nonzero; stroke: none;" p:name="bgRect1" id="bgRect1111221500506650833"/> + <rect width="20" height="20" x="159" y="0" style="opacity: 1; color: rgb(0, 0, 0); fill: rgb(255, 255, 255); fill-opacity: 1; fill-rule: nonzero; stroke: none;" p:name="bgRect2" id="bgRect2111221500506650833"/> + <rect width="178" height="19" x="0.5" y="0.5" style="overflow: visible; marker: none; opacity: 1; color: rgb(0, 0, 0); fill: none; fill-opacity: 1; fill-rule: nonzero; stroke: rgb(127, 157, 185); stroke-width: 1; stroke-linecap: square; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-dashoffset: 0pt; stroke-opacity: 1; visibility: visible; display: inline;" p:name="rect" id="rect111221500506650833"/> + <rect width="16" height="15" rx="1" ry="1" x="160.5" y="2.5" style="overflow: visible; marker: none; opacity: 1; color: rgb(0, 0, 0); fill: url(#linearGradient4129111221500506650833) rgb(0, 0, 0); fill-opacity: 1; fill-rule: nonzero; stroke: rgb(195, 211, 248); stroke-width: 0.969547; stroke-linecap: square; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-dashoffset: 0pt; stroke-opacity: 1; visibility: visible; display: inline;" p:name="dropRect" id="dropRect111221500506650833"/> + <path d="M 172.5,8 L 168.5,12 L 164.5,8" style="overflow: visible; marker: none; color: rgb(0, 0, 0); fill: none; fill-opacity: 1; fill-rule: nonzero; stroke: rgb(77, 97, 133); stroke-width: 2; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dashoffset: 0pt; stroke-opacity: 1; visibility: visible; display: inline;" p:name="marker" id="marker111221500506650833"/> + <rect width="155" height="15" x="2.5" y="2.5" style="opacity: 1; color: rgb(0, 0, 0); fill: rgb(49, 106, 197); fill-opacity: 1; fill-rule: nonzero; stroke: rgb(255, 255, 255); stroke-dasharray: 1, 1; visibility: hidden;" p:name="focusRect" id="focusRect111221500506650833"/> + <text x="5" y="10" style="text-align: left; text-anchor: start; dominant-baseline: central; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: Tahoma; font-size: 11px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="text111221500506650833">(*) CS-Project</text><path id="text111221500506650_underline833" style="fill: none; stroke-width: 1px; visibility: hidden;"/> + </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RichTextBox" transform="matrix(1, 0, 0, 1, 510, 70)"><p:metadata><p:property name="width"><![CDATA[200,0]]></p:property><p:property name="textContent"><![CDATA[<span _moz_dirty="" style="font-weight: bold;">Switch Active Project:<br _moz_dirty=""/></span>]]></p:property><p:property name="textFont"><![CDATA[Arial|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata> + + <foreignObject x="0" y="0" width="200" height="15" p:name="text" id="text121221500540174554" style="font-family: Arial; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; color: rgb(0, 0, 0); opacity: 1;"><div xmlns="http://www.w3.org/1999/xhtml"><span _moz_dirty="" style="font-weight: bold;">Switch Active Project:<br _moz_dirty=""/></span></div></foreignObject><path id="text121221500540174_underline554" style="fill: none; stroke-width: 1px; visibility: hidden;"/> + </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bitmap" transform="matrix(1, 0, 0, 1, 710, 75)"><p:metadata><p:property name="box"><![CDATA[72,30]]></p:property><p:property name="imageData"><![CDATA[72,30,images/logout__whitetext-grayroundbg-whitearrowright.jpeg]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[0|]]></p:property></p:metadata> + <defs> + <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="imageShading" id="imageShading131221500849602635"> + <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/> + </filter> + <g p:name="container" id="container131221500849602635"> + <rect style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 0pt; fill-opacity: 1;" p:name="bgRect" id="bgRect131221500849602635" width="72" height="30" transform="translate(0)"/> + <g p:name="imageContainer" id="imageContainer131221500849602635" transform="scale(1)"> + <image x="0" y="0" p:name="image" id="image131221500849602635" xlink:href="images/logout__whitetext-grayroundbg-whitearrowright.jpeg" xmlns:xlink="http://www.w3.org/1999/xlink" width="72" height="30"/> + </g> + </g> + </defs> + <use xlink:href="#container131221500849602635" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#imageShading131221500849602635)" style="opacity: 0.6; visibility: hidden;" p:name="bgCopy" id="bgCopy131221500849602635"/> + <use xlink:href="#container131221500849602635" xmlns:xlink="http://www.w3.org/1999/xlink"/> + </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.GTK.Widgets:Panel" transform="matrix(1, 0, 0, 1, 240, 68)"><p:metadata><p:property name="box"><![CDATA[260,77]]></p:property><p:property name="withBlur"><![CDATA[true]]></p:property></p:metadata> + <defs> + <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="shadingFilter91221500252926148"> + <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/> + </filter> + <rect x="0" y="0" width="260" height="77" style="stroke: none; fill-opacity: 1; fill: rgb(237, 233, 227);" p:name="rect" id="rect91221500252926148"/> + </defs> + <use xlink:href="#rect91221500252926148" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#shadingFilter91221500252926148)" style="opacity: 0.6; visibility: visible;" p:heavy="true" p:name="bgCopy" id="bgCopy91221500252926148" filter="url(#shadingFilter91221500252926148)"/> + <use xlink:href="#rect91221500252926148" xmlns:xlink="http://www.w3.org/1999/xlink"/> + </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.GTK.Widgets:Panel" transform="matrix(1, 0, 0, 1, 15, 65)"><p:metadata><p:property name="box"><![CDATA[220,80]]></p:property><p:property name="withBlur"><![CDATA[true]]></p:property></p:metadata> + <defs> + <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="shadingFilter151221501087249271"> + <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/> + </filter> + <rect x="0" y="0" width="220" height="80" style="stroke: none; fill-opacity: 1; fill: rgb(237, 233, 227);" p:name="rect" id="rect151221501087249271"/> + </defs> + <use xlink:href="#rect151221501087249271" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#shadingFilter151221501087249271)" style="opacity: 0.6; visibility: visible;" p:heavy="true" p:name="bgCopy" id="bgCopy151221501087249271" filter="url(#shadingFilter151221501087249)"/> + <use xlink:href="#rect151221501087249271" xmlns:xlink="http://www.w3.org/1999/xlink"/> + </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:Bitmap" transform="matrix(1, 0, 0, 1, 15, 65)"><p:metadata><p:property name="box"><![CDATA[220,80]]></p:property><p:property name="imageData"><![CDATA[239,87,images/cs-project_logo.gif]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[0|]]></p:property></p:metadata> + <defs> + <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="imageShading" id="imageShading61221499981280729"> + <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/> + </filter> + <g p:name="container" id="container61221499981280729"> + <rect style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 0pt; fill-opacity: 1;" p:name="bgRect" id="bgRect61221499981280729" width="220" height="80" transform="translate(0)"/> + <g p:name="imageContainer" id="imageContainer61221499981280729" transform="scale(0.920502, 0.91954)"> + <image x="0" y="0" p:name="image" id="image61221499981280729" xlink:href="images/cs-project_logo.gif" xmlns:xlink="http://www.w3.org/1999/xlink" width="239" height="87"/> + </g> + </g> + </defs> + <use xlink:href="#container61221499981280729" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#imageShading61221499981280729)" style="opacity: 0.6; visibility: hidden;" p:name="bgCopy" id="bgCopy61221499981280729"/> + <use xlink:href="#container61221499981280729" xmlns:xlink="http://www.w3.org/1999/xlink"/> + </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.Common:RichTextBox" transform="matrix(1, 0, 0, 1, 242, 68)"><p:metadata><p:property name="width"><![CDATA[235,0]]></p:property><p:property name="textContent"><![CDATA[<h3 _moz_dirty=""><span style="text-decoration: underline;" _moz_dirty="">Current User</span></h3><span style="font-weight: bold;" _moz_dirty="">CrazedSanity Dot Com</span><br _moz_dirty=""/>Dan Falconer (<a _moz_dirty="" href="[object XULElement]">slaughter</a>)<br _moz_dirty=""/>Lead Developer, <a _moz_dirty="" href="[object XULElement]">Group Admin</a>, <a _moz_dirty="" href="[object XULElement]">Admin</a>]]></p:property><p:property name="textFont"><![CDATA[Arial|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata> + + <foreignObject x="0" y="0" width="235" height="71" p:name="text" id="text8122150011958170" style="font-family: Arial; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; color: rgb(0, 0, 0); opacity: 1;"><div xmlns="http://www.w3.org/1999/xhtml"><h3 _moz_dirty=""><span style="text-decoration: underline;" _moz_dirty="">Current User</span></h3><span style="font-weight: bold;" _moz_dirty="">CrazedSanity Dot Com</span><br _moz_dirty=""/>Dan Falconer (<a _moz_dirty="" href="[object XULElement]">slaughter</a>)<br _moz_dirty=""/>Lead Developer, <a _moz_dirty="" href="[object XULElement]">Group Admin</a>, <a _moz_dirty="" href="[object XULElement]">Admin</a></div></foreignObject><path id="text81221500119581_underline70" style="fill: none; stroke-width: 1px; visibility: hidden;"/> + </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:locked="true"><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.WindowsXP.Widgets:TabPanel" transform="matrix(1, 0, 0, 1, 20, 165)"><p:metadata><p:property name="box"><![CDATA[980,430]]></p:property><p:property name="withShadow"><![CDATA[false]]></p:property><p:property name="height"><![CDATA[0,25]]></p:property><p:property name="start"><![CDATA[75,0]]></p:property><p:property name="end"><![CDATA[175,0]]></p:property><p:property name="tabTitle"><![CDATA[Summary]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property><p:property name="textFont"><![CDATA[Tahoma|normal|normal|11px|none]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata> + <defs> + <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="shadingFilter31221499706834177"> + <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/> + </filter> + <linearGradient x1="0%" y1="0%" x2="0%" y2="100%" p:name="markerGradient" id="markerGradient31221499706834177"> + <stop style="stop-color: rgb(230, 139, 44); stop-opacity: 1;" offset="0"/> + <stop style="stop-color: rgb(255, 199, 60); stop-opacity: 1;" offset="1"/> + </linearGradient> + <path style="stroke: none; fill: rgb(51, 51, 51);" p:name="boxForShadowing" id="boxForShadowing31221499706834177" d="M 975 26 L 980 26 L 980 430 L 1 430 L 1 425 L 975 425 z"/> + </defs> + <use xlink:href="#boxForShadowing31221499706834177" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#shadingFilter31221499706834177)" style="opacity: 0.6; visibility: hidden;" p:name="shadow" id="shadow31221499706834177"/> + <rect style="fill: url(#markerGradient31221499706834177) rgb(0, 0, 0);" rx="3" ry="3" p:name="activeMarker" id="activeMarker31221499706834177" transform="translate(75)" width="101" height="5"/> + <path style="stroke: rgb(145, 155, 156); stroke-width: 1px; fill: rgb(244, 243, 238);" transform="translate(0.5, 0.5)" p:name="path" id="path31221499706834177" d="M 175 2.5 L 175 25 L 980 25 L 980 430 L 0 430 L 0 25 L 75 25 L 75 2.5"/> + <text x="100" y="14" style="text-align: left; text-anchor: start; dominant-baseline: central; fill: rgb(0, 0, 0); fill-opacity: 1; font-family: Tahoma; font-size: 11px; font-weight: normal; font-style: normal; text-decoration: none;" xml:space="preserve" p:name="text" id="text31221499706834177">Summary</text><path id="text31221499706834177_underline" style="fill: none; stroke-width: 1px; visibility: hidden;"/><path id="text31221499706834_underline177" style="fill: none; stroke-width: 1px; visibility: hidden;"/> + </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.WindowsXP.Widgets:TabHeader" transform="matrix(1, 0, 0, 1, 20, 165)"><p:metadata><p:property name="box"><![CDATA[80,23]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="tabTitle"><![CDATA[Admin]]></p:property><p:property name="textColor"><![CDATA[#483EFAFF]]></p:property><p:property name="textFont"><![CDATA[Tahoma|bold|normal|11px|underline]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata> + <g transform="translate(0.5, 2.5)"> + <path style="fill: rgb(245, 244, 234); stroke-width: 1px; fill-opacity: 1; stroke: rgb(145, 167, 180); stroke-opacity: 1;" p:name="rect" id="rect401221512100128952" d="M 0 22.5 L 0 5 C 0 0 0 0 5 0 L 73 0 C 78 0 78 0 78 5 L 78 22.5"/> + <text x="18" y="12" style="text-align: left; text-anchor: start; dominant-baseline: central; fill: rgb(72, 62, 250); fill-opacity: 1; font-family: Tahoma; font-size: 11px; font-weight: bold; font-style: normal; text-decoration: underline;" transform="translate(0, -1)" xml:space="preserve" p:name="text" id="text401221512100128952">Admin</text><path id="text401221512100128_underline952" style="fill: none; stroke-width: 1px; visibility: visible; stroke: rgb(72, 62, 250); stroke-opacity: 1;" d="M 18 17.5 L 62 17.5"/> + </g> + </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.WindowsXP.Widgets:TabHeader" transform="matrix(1, 0, 0, 1, 285, 165)"><p:metadata><p:property name="box"><![CDATA[115,23]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="tabTitle"><![CDATA[Contacts (8/300)]]></p:property><p:property name="textColor"><![CDATA[#483EFAFF]]></p:property><p:property name="textFont"><![CDATA[Tahoma|normal|normal|11px|underline]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata> + <g transform="translate(0.5, 2.5)"> + <path style="fill: rgb(245, 244, 234); stroke-width: 1px; fill-opacity: 1; stroke: rgb(145, 167, 180); stroke-opacity: 1;" p:name="rect" id="rect51221499906339918" d="M 0 22.5 L 0 5 C 0 0 0 0 5 0 L 108 0 C 113 0 113 0 113 5 L 113 22.5"/> + <text x="12" y="12" style="text-align: left; text-anchor: start; dominant-baseline: central; fill: rgb(72, 62, 250); fill-opacity: 1; font-family: Tahoma; font-size: 11px; font-weight: normal; font-style: normal; text-decoration: underline;" transform="translate(0, -1)" xml:space="preserve" p:name="text" id="text51221499906339918">Contacts (8/300)</text><path id="text51221499906339_underline918" style="fill: none; stroke-width: 1px; visibility: visible; stroke: rgb(72, 62, 250); stroke-opacity: 1;" d="M 13 18.5 L 105 18.5"/> + </g> + </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.WindowsXP.Widgets:TabHeader" transform="matrix(1, 0, 0, 1, 398, 165)"><p:metadata><p:property name="box"><![CDATA[207,23]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="tabTitle"><![CDATA[Non-linked Helpdesk Issues (1/1)]]></p:property><p:property name="textColor"><![CDATA[#483EFAFF]]></p:property><p:property name="textFont"><![CDATA[Tahoma|normal|normal|11px|underline]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata> + <g transform="translate(0.5, 2.5)"> + <path style="fill: rgb(245, 244, 234); stroke-width: 1px; fill-opacity: 1; stroke: rgb(145, 167, 180); stroke-opacity: 1;" p:name="rect" id="rect51221499906339887161" d="M 0 22.5 L 0 5 C 0 0 0 0 5 0 L 200 0 C 205 0 205 0 205 5 L 205 22.5"/> + <text x="13" y="12" style="text-align: left; text-anchor: start; dominant-baseline: central; fill: rgb(72, 62, 250); fill-opacity: 1; font-family: Tahoma; font-size: 11px; font-weight: normal; font-style: normal; text-decoration: underline;" transform="translate(0, -1)" xml:space="preserve" p:name="text" id="text51221499906339887161">Non-linked Helpdesk Issues (1/1)</text><path id="text51221499906339887_underline161" style="fill: none; stroke-width: 1px; visibility: visible; stroke: rgb(72, 62, 250); stroke-opacity: 1;" d="M 11 19.5 L 193 19.5"/><path id="text51221499906339_underline887161" style="fill: none; stroke-width: 1px; visibility: visible; stroke: rgb(72, 62, 250); stroke-opacity: 1;" d="M 13 18.5 L 105 18.5"/> + </g> + </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.WindowsXP.Widgets:TabHeader" transform="matrix(1, 0, 0, 1, 603, 165)"><p:metadata><p:property name="box"><![CDATA[157,23]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="tabTitle"><![CDATA[Non-Linked Tasks (2/10)]]></p:property><p:property name="textColor"><![CDATA[#483EFAFF]]></p:property><p:property name="textFont"><![CDATA[Tahoma|normal|normal|11px|underline]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata> + <g transform="translate(0.5, 2.5)"> + <path style="fill: rgb(245, 244, 234); stroke-width: 1px; fill-opacity: 1; stroke: rgb(145, 167, 180); stroke-opacity: 1;" p:name="rect" id="rect51221499906339698830" d="M 0 22.5 L 0 5 C 0 0 0 0 5 0 L 150 0 C 155 0 155 0 155 5 L 155 22.5"/> + <text x="10" y="12" style="text-align: left; text-anchor: start; dominant-baseline: central; fill: rgb(72, 62, 250); fill-opacity: 1; font-family: Tahoma; font-size: 11px; font-weight: normal; font-style: normal; text-decoration: underline;" transform="translate(0, -1)" xml:space="preserve" p:name="text" id="text51221499906339698830">Non-Linked Tasks (2/10)</text><path id="text51221499906339698_underline830" style="fill: none; stroke-width: 1px; visibility: visible; stroke: rgb(72, 62, 250); stroke-opacity: 1;" d="M 9 18.5 L 146 18.5"/><path id="text51221499906339_underline698830" style="fill: none; stroke-width: 1px; visibility: visible; stroke: rgb(72, 62, 250); stroke-opacity: 1;" d="M 13 18.5 L 105 18.5"/> + </g> + </g><g xmlns="http://www.w3.org/2000/svg" p:type="Shape" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:def="Evolus.WindowsXP.Widgets:TabHeader" transform="matrix(1, 0, 0, 1, 758, 165)"><p:metadata><p:property name="box"><![CDATA[152,23]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="tabTitle"><![CDATA[Documentation (10)]]></p:property><p:property name="textColor"><![CDATA[#483EFAFF]]></p:property><p:property name="textFont"><![CDATA[serif|normal|normal|11px|none]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata> + <g transform="translate(0.5, 2.5)"> + <path style="fill: rgb(245, 244, 234); stroke-width: 1px; fill-opacity: 1; stroke: rgb(145, 167, 180); stroke-opacity: 1;" p:name="rect" id="rect51221499906339698647445" d="M 0 22.5 L 0 5 C 0 0 0 0 5 0 L 145 0 C 150 0 150 0 150 5 L 150 22.5"/> + <text x="21" y="12" style="text-align: left; text-anchor: start; dominant-baseline: central; fill: rgb(72, 62, 250); fill-opacity: 1; font-family: serif; font-size: 11px; font-weight: normal; font-style: normal; text-decoration: none;" transform="translate(0, -1)" xml:space="preserve" p:name="text" id="text51221499906339698647445">Documentation (10)</text><path id="text51221499906339698647_underline445" style="fill: none; stroke-width: 1px; visibility: hidden; stroke: rgb(72, 62, 250); stroke-opacity: 1;" d="M 22 18.5 L 132 18.5"/><path id="text51221499906339698_underline647445" style="fill: none; stroke-width: 1px; visibility: visible; stroke: rgb(72, 62, 250); stroke-opacity: 1;" d="M 4 18.5 L 141 18.5"/><path id="text51221499906339_underline698647445" style="fill: none; stroke-width: 1px; visibility: visible; stroke: rgb(72, 62, 250); stroke-opacity: 1;" d="M 13 18.5 L 105 18.5"/> + </g> + </g><g p:type="Shape" p:def="Evolus.WindowsXP.Widgets:TabHeader" transform="matrix(1, 0, 0, 1, 195, 165)"><p:metadata><p:property name="box"><![CDATA[95,23]]></p:property><p:property name="disabled"><![CDATA[false]]></p:property><p:property name="tabTitle"><![CDATA[Overview]]></p:property><p:property name="textColor"><![CDATA[#483EFAFF]]></p:property><p:property name="textFont"><![CDATA[Tahoma|normal|normal|11px|underline]]></p:property><p:property name="textAlign"><![CDATA[1,1]]></p:property></p:metadata> + <g transform="translate(0.5, 2.5)"> + <path style="fill: rgb(245, 244, 234); stroke-width: 1px; fill-opacity: 1; stroke: rgb(145, 167, 180); stroke-opacity: 1;" p:name="rect" id="rect41221499749105927" d="M 0 22.5 L 0 5 C 0 0 0 0 5 0 L 88 0 C 93 0 93 0 93 5 L 93 22.5"/> + <text x="22" y="12" style="text-align: left; text-anchor: start; dominant-baseline: central; fill: rgb(72, 62, 250); fill-opacity: 1; font-family: Tahoma; font-size: 11px; font-weight: normal; font-style: normal; text-decoration: underline;" transform="translate(0, -1)" xml:space="preserve" p:name="text" id="text41221499749105927">Overview</text><path id="text41221499749105927_underline" style="fill: none; stroke-width: 1px; visibility: visible; stroke: rgb(72, 62, 250); stroke-opacity: 1;" d="M 21 17.5 L 72 17.5"/><path id="text41221499749105_underline927" style="fill: none; stroke-width: 1px; visibility: visible; stroke: rgb(72, 62, 250); stroke-opacity: 1;" d="M 28 19.5 L 80 19.5"/> + </g> + </g><g p:type="Shape" p:def="Evolus.Common:Bitmap" transform="matrix(1, 0, 0, 1, 176, 168)"><p:metadata><p:property name="box"><![CDATA[17,18]]></p:property><p:property name="imageData"><![CDATA[50,48,images/exclamation__black-yellowgradienttriangle.jpeg]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[0|]]></p:property></p:metadata> + <defs> + <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="imageShading" id="imageShading161221501550549927"> + <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/> + </filter> + <g p:name="container" id="container161221501550549927"> + <rect style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 0pt; fill-opacity: 1;" p:name="bgRect" id="bgRect161221501550549927" width="17" height="18" transform="translate(0)"/> + <g p:name="imageContainer" id="imageContainer161221501550549927" transform="scale(0.34, 0.375)"> + <image x="0" y="0" p:name="image" id="image161221501550549927" xlink:href="images/exclamation__black-yellowgradienttriangle.jpeg" xmlns:xlink="http://www.w3.org/1999/xlink" width="50" height="48"/> + </g> + </g> + </defs> + <use xlink:href="#container161221501550549927" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(1, 1)" p:filter="url(#imageShading161221501550549927)" style="opacity: 0.6; visibility: hidden;" p:name="bgCopy" id="bgCopy161221501550549927"/> + <use xlink:href="#container161221501550549927" xmlns:xlink="http://www.w3.org/1999/xlink"/> + </g></g><g xmlns="http://www.w3.org/2000/svg" p:type="Group" xmlns:p="http://www.evolus.vn/Namespace/Pencil" p:locked="true"><g p:type="Group"><g p:type="Shape" p:def="Evolus.GTK.Widgets:Panel" transform="matrix(1, 0, 0, 1, 34, 220)"><p:metadata><p:property name="box"><![CDATA[260,180]]></p:property><p:property name="withBlur"><![CDATA[true]]></p:property></p:metadata> + <defs> + <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="shadingFilter" id="shadingFilter81221683996648"> + <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/> + </filter> + <rect x="0" y="0" width="260" height="180" style="stroke: none; fill-opacity: 1; fill: rgb(237, 233, 227);" p:name="rect" id="rect81221683996648"/> + </defs> + <use xlink:href="#rect81221683996648" xmlns:xlink="http://www.w3.org/1999/xlink" transform="translate(2, 2)" p:filter="url(#shadingFilter81221683996648)" style="opacity: 0.6; visibility: visible;" p:heavy="true" p:name="bgCopy" id="bgCopy81221683996648" filter="url(#shadingFilter81221683996648)"/> + <use xlink:href="#rect81221683996648" xmlns:xlink="http://www.w3.org/1999/xlink"/> + </g><g p:type="Shape" p:def="Evolus.WindowsXP.Widgets:Scrollbar" transform="matrix(1, 0, 0, 1, 276, 220)"><p:metadata><p:property name="box"><![CDATA[20,180]]></p:property><p:property name="thumbBegin"><![CDATA[10,20]]></p:property><p:property name="thumbEnd"><![CDATA[10,157]]></p:property><p:property name="disabled"><![CDATA[true]]></p:property></p:metadata> + <g transform="translate(-1, 1)"> + <defs p:name="defs19" id="defs1991221684046706"> + <linearGradient x1="155.22887" y1="2.0773644" x2="171.69083" y2="18.53932" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.03083, 0, 0, 0.970088, 20, 115)" p:name="linearGradient3294" id="linearGradient329491221684046706"> + <stop style="stop-color: rgb(224, 224, 224); stop-opacity: 1;" offset="0" p:name="stop5" id="stop591221684046706"/> + <stop style="stop-color: rgb(224, 224, 224); stop-opacity: 1;" offset="0.60036409" p:name="stop6" id="stop691221684046706"/> + <stop style="stop-color: rgb(227, 227, 227); stop-opacity: 1;" offset="0.71293235" p:name="stop7" id="stop791221684046706"/> + <stop style="stop-color: rgb(224, 224, 224); stop-opacity: 1;" offset="1" p:name="stop8" id="stop891221684046706"/> + </linearGradient> + <linearGradient p:name="linearGradient3224" id="linearGradient322491221684046706"> + <stop style="stop-color: rgb(243, 241, 236); stop-opacity: 1;" offset="0" p:name="stop3226" id="stop322691221684046706"/> + <stop style="stop-color: rgb(255, 255, 255); stop-opacity: 1;" offset="1" p:name="stop3232" id="stop323291221684046706"/> + </linearGradient> + <linearGradient p:name="linearGradient3200" id="linearGradient320091221684046706"> + <stop style="stop-color: rgb(235, 235, 235); stop-opacity: 1;" offset="0" p:name="stop1" id="stop191221684046706"/> + <stop style="stop-color: rgb(235, 235, 235); stop-opacity: 1;" offset="0.42391136" p:name="stop2" id="stop291221684046706"/> + <stop style="stop-color: rgb(224, 224, 224); stop-opacity: 1;" offset="0.77979147" p:name="stop3" id="stop391221684046706"/> + <stop style="stop-color: rgb(224, 224, 224); stop-opacity: 1;" offset="1" p:name="stop4" id="stop491221684046706"/> + </linearGradient> + <linearGradient x1="155.22887" y1="2.0773644" x2="171.69083" y2="18.53932" xlink:href="#linearGradient41291121432129478291221684046706" xmlns:xlink="http://www.w3.org/1999/xlink" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.03083, 0, 0, 0.970088, 20, 115)" p:name="linearGradient2414" id="linearGradient241491221684046706"/> + <linearGradient x1="155.22887" y1="2.0773644" x2="171.69083" y2="18.53932" xlink:href="#linearGradient41291121432129478291221684046706" xmlns:xlink="http://www.w3.org/1999/xlink" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.03083, 0, 0, 0.970088, 20, 115)" p:name="linearGradient2416" id="linearGradient241691221684046706"/> + <defs p:name="defs217711214321294782" id="defs21771121432129478291221684046706"> + <linearGradient x1="155.22887" y1="2.0773644" x2="171.69083" y2="18.53932" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.03083, 0, 0, 0.970088, 20, 115)" p:name="linearGradient412911214321294782" id="linearGradient41291121432129478291221684046706"> + <stop style="stop-color: rgb(200, 214, 251); stop-opacity: 1;" offset="0" p:name="stop111214321294782" id="stop11121432129478291221684046706"/> + <stop style="stop-color: rgb(179, 207, 252); stop-opacity: 1;" offset="0.5" p:name="stop3284" id="stop328491221684046706"/> + <stop style="stop-color: rgb(181, 205, 250); stop-opacity: 1;" offset="1" p:name="stop211214321294782" id="stop21121432129478291221684046706"/> + </linearGradient> + </defs> + <linearGradient x1="155.22887" y1="134.00845" x2="169.75064" y2="134.00845" xlink:href="#linearGradient329491221684046706" xmlns:xlink="http://www.w3.org/1999/xlink" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.03083, 0, 0, 0.970088, -158, 100.125)" p:name="linearGradient2425" id="linearGradient242591221684046706"/> + <linearGradient x1="190.25" y1="125" x2="207" y2="145" xlink:href="#linearGradient320091221684046706" xmlns:xlink="http://www.w3.org/1999/xlink" gradientUnits="userSpaceOnUse" gradientTransform="translate(-187, -23.875)" p:name="linearGradient3206" id="linearGradient320691221684046706"/> + <linearGradient x1="187.5" y1="125.5625" x2="207.55617" y2="125.5625" xlink:href="#linearGradient322491221684046706" xmlns:xlink="http://www.w3.org/1999/xlink" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1, 0, 0, 3.97713, -187.5, -810.338)" p:name="linearGradient3214" id="linearGradient321491221684046706"/> + <linearGradient x1="190.25" y1="125" x2="207" y2="145" xlink:href="#linearGradient320091221684046706" xmlns:xlink="http://www.w3.org/1999/xlink" gradientUnits="userSpaceOnUse" gradientTransform="translate(-187, -243.875)" p:name="linearGradient3270" id="linearGradient327091221684046706"/> + <linearGradient x1="154.72905" y1="130.40053" x2="169.75848" y2="130.40053" xlink:href="#linearGradient329491221684046706" xmlns:xlink="http://www.w3.org/1999/xlink" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.03083, 0, 0, 0.970088, -158, -119.875)" p:name="linearGradient3272" id="linearGradient327291221684046706"/> + <linearGradient x1="190.25" y1="125" x2="207" y2="145" xlink:href="#linearGradient320091221684046706" xmlns:xlink="http://www.w3.org/1999/xlink" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1, 0, 0, 9.46667, -187, -2299.08)" p:name="linearGradient3280" id="linearGradient328091221684046706"/> + <linearGradient x1="190.01523" y1="134.92021" x2="204.98477" y2="134.92021" xlink:href="#linearGradient329491221684046706" xmlns:xlink="http://www.w3.org/1999/xlink" gradientUnits="userSpaceOnUse" gradientTransform="translate(-188, -24.875)" p:name="linearGradient3292" id="linearGradient329291221684046706"/> + </defs> + <rect width="19" height="177" x="0.5" y="0.5" style="fill: url(#linearGradient321491221684046706) rgb(0, 0, 0); fill-opacity: 1; fill-rule: nonzero; stroke: rgb(238, 237, 229); stroke-width: 1; stroke-opacity: 1;" p:name="bgRect" id="bgRect91221684046706"/> + <g p:name="endButton" id="endButton91221684046706" transform="translate(0, -63)"> + <rect width="18" height="19" rx="3" ry="3" x="1" y="221.12502" style="fill: url(#linearGradient320691221684046706) rgb(0, 0, 0); fill-opacity: 1; fill-rule: nonzero; stroke: none;" p:name="rect3198" id="rect319891221684046706"/> + <rect width="17" height="18" rx="2.5" ry="2.5" x="1" y="221.12502" style="fill: rgb(255, 255, 255); fill-opacity: 1; fill-rule: nonzero; stroke: none;" p:name="bgRect211214321294782" id="bgRect21121432129478291221684046706"/> + <rect width="14" height="15" rx="1" ry="1" x="2.5" y="222.62502" style="overflow: visible; marker: none; fill: url(#linearGradient242591221684046706) rgb(0, 0, 0); fill-opacity: 1; fill-rule: nonzero; stroke: rgb(231, 231, 231); stroke-width: 0.969547; stroke-linecap: square; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-dashoffset: 0pt; stroke-opacity: 1; visibility: visible; display: inline;" p:name="endDropRect" id="endDropRect91221684046706"/> + <path d="M 13.5,228.12501 L 9.5,232.12501 L 5.5,228.12501" style="overflow: visible; marker: none; fill: none; fill-opacity: 1; fill-rule: nonzero; stroke: rgb(183, 183, 183); stroke-width: 2; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dashoffset: 0pt; stroke-opacity: 1; visibility: visible; display: inline;" p:name="endMarker" id="endMarker91221684046706"/> + </g> + <g p:name="beginButton" id="beginButton91221684046706"> + <rect width="18" height="19" rx="2.5" ry="2.5" x="1" y="1.1250114" style="fill: url(#linearGradient327091221684046706) rgb(0, 0, 0); fill-opacity: 1; fill-rule: nonzero; stroke: none;" p:name="rect3262" id="rect326291221684046706"/> + <rect width="17" height="18" rx="2.5" ry="2.5" x="1" y="1.1250114" style="fill: rgb(255, 255, 255); fill-opacity: 1; fill-rule: nonzero; stroke: none;" p:name="rect3264" id="rect326491221684046706"/> + <rect width="14" height="15" rx="1" ry="1" x="2.5" y="2.6250114" style="overflow: visible; marker: none; fill: url(#linearGradient327291221684046706) rgb(0, 0, 0); fill-opacity: 1; fill-rule: nonzero; stroke: rgb(231, 231, 231); stroke-width: 0.969547; stroke-linecap: square; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-dashoffset: 0pt; stroke-opacity: 1; visibility: visible; display: inline;" p:name="beginDropRect" id="beginDropRect91221684046706"/> + <path d="M 13.5,12.125011 L 9.5,8.1250114 L 5.5,12.125011" style="overflow: visible; marker: none; fill: none; fill-opacity: 1; fill-rule: nonzero; stroke: rgb(183, 183, 183); stroke-width: 2; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dashoffset: 0pt; stroke-opacity: 1; visibility: visible; display: inline;" p:name="beginMarker" id="beginMarker91221684046706"/> + </g> + <rect width="18" height="136.5" rx="3" ry="3" x="1" y="20" style="fill: url(#linearGradient328091221684046706) rgb(0, 0, 0); fill-opacity: 1; fill-rule: nonzero; stroke: none; visibility: hidden;" p:name="thumbOut" id="thumbOut91221684046706" transform="translate(0, 1)"/> + <rect width="17" height="135" rx="2.5" ry="2.5" x="1" y="21" style="fill: rgb(255, 255, 255); fill-opacity: 1; fill-rule: nonzero; stroke: none; visibility: hidden;" p:name="thumbMid" id="thumbMid91221684046706" transform="translate(0)"/> + <rect width="14" height="132" rx="1" ry="1" x="2.5" y="22.5" style="overflow: visible; marker: none; fill: url(#linearGradient329291221684046706) rgb(0, 0, 0); fill-opacity: 1; fill-rule: nonzero; stroke: rgb(195, 211, 248); stroke-width: 0.969547; stroke-linecap: square; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-dashoffset: 0pt; stroke-opacity: 1; visibility: hidden; display: inline;" p:name="thumbIn" id="thumbIn91221684046706" transform="translate(0)"/> + <g p:name="grip" id="grip91221684046706" transform="translate(0, -12)" style="visibility: hidden;"> + <path d="M 5.5,100.62501 L 11.50943,100.62501" style="fill: none; fill-rule: evenodd; stroke: rgb(255, 255, 255); stroke-width: 1; stroke-linecap: square; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" p:name="path3308" id="path330891221684046706"/> + <path d="M 6.5,101.62501 L 12.50943,101.62501" style="fill: none; fill-rule: evenodd; stroke: rgb(140, 176, 248); stroke-width: 1; stroke-linecap: square; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" p:name="path3312" id="path331291221684046706"/> + <path d="M 5.5,102.62501 L 11.50943,102.62501" style="fill: none; fill-rule: evenodd; stroke: rgb(255, 255, 255); stroke-width: 1; stroke-linecap: square; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" p:name="path3320" id="path332091221684046706"/> + <path d="M 6.5,103.62501 L 12.50943,103.62501" style="fill: none; fill-rule: evenodd; stroke: rgb(140, 176, 248); stroke-width: 1; stroke-linecap: square; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" p:name="path3322" id="path332291221684046706"/> + <path d="M 5.5,96.625011 L 11.50943,96.625011" style="fill: none; fill-rule: evenodd; stroke: rgb(255, 255, 255); stroke-width: 1; stroke-linecap: square; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" p:name="path3324" id="path332491221684046706"/> + <path d="M 6.5,97.625011 L 12.50943,97.625011" style="fill: none; fill-rule: evenodd; stroke: rgb(140, 176, 248); stroke-width: 1; stroke-linecap: square; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" p:name="path3326" id="path332691221684046706"/> + <path d="M 5.5,98.625011 L 11.50943,98.625011" style="fill: none; fill-rule: evenodd; stroke: rgb(255, 255, 255); stroke-width: 1; stroke-linecap: square; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" p:name="path3328" id="path332891221684046706"/> + <path d="M 6.5,99.625011 L 12.50943,99.625011" style="fill: none; fill-rule: evenodd; stroke: rgb(140, 176, 248); stroke-width: 1; stroke-linecap: square; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" p:name="path3330" id="path333091221684046706"/> + </g></g> + </g></g><g p:type="Group"><g p:type="Shape" p:def="Evolus.Common:RichTextBox" transform="matrix(1, 0, 0, 1, 43, 228)"><p:metadata><p:property name="width"><![CDATA[210,0]]></p:property><p:property name="textContent"><![CDATA[<span style="font-weight: bold;" _moz_dirty="">Project Leader(s):<br _moz_dirty=""/></span> Dan Falconer (slaughter)<span style="font-weight: bold;" _moz_dirty=""><br _moz_dirty=""/><br _moz_dirty=""/>Lead Developer(s):<br _moz_dirty=""/></span> Dan Falconer (slaughter)<span style="font-weight: bold;" _moz_dirty=""><br _moz_dirty=""/><br _moz_dirty=""/>Developers:<br _moz_dirty=""/></span> Bill Bray (bilfurd)<br _moz_dirty=""/> Jesse Lesperance (jlesperance)<br _moz_dirty=""/> Vikas Rajput (vikasrajput)<span style="font-weight: bold;" _moz_dirty=""><br _moz_dirty=""/></span>]]></p:property><p:property name="textFont"><![CDATA[Arial|normal|normal|12px|none]]></p:property><p:property name="textColor"><![CDATA[#000000FF]]></p:property></p:metadata> + + <foreignObject x="0" y="0" width="210" height="150" p:name="text" id="text51221683183431" style="font-family: Arial; font-size: 12px; font-weight: normal; font-style: normal; text-decoration: none; color: rgb(0, 0, 0); opacity: 1;"><div xmlns="http://www.w3.org/1999/xhtml"><span style="font-weight: bold;" _moz_dirty="">Project Leader(s):<br _moz_dirty=""/></span> Dan Falconer (slaughter)<span style="font-weight: bold;" _moz_dirty=""><br _moz_dirty=""/><br _moz_dirty=""/>Lead Developer(s):<br _moz_dirty=""/></span> Dan Falconer (slaughter)<span style="font-weight: bold;" _moz_dirty=""><br _moz_dirty=""/><br _moz_dirty=""/>Developers:<br _moz_dirty=""/></span> Bill Bray (bilfurd)<br _moz_dirty=""/> Jesse Lesperance (jlesperance)<br _moz_dirty=""/> Vikas Rajput (vikasrajput)<span style="font-weight: bold;" _moz_dirty=""><br _moz_dirty=""/></span></div></foreignObject><path id="text51221683183431_underline" style="fill: none; stroke-width: 1px; visibility: hidden;"/> + </g><g p:type="Shape" p:def="Evolus.Common:Bitmap" transform="matrix(1, 0, 0, 1, 178, 223)"><p:metadata><p:property name="box"><![CDATA[20,20]]></p:property><p:property name="imageData"><![CDATA[48,48,images/user_add.jpeg]]></p:property><p:property name="withBlur"><![CDATA[false]]></p:property><p:property name="fillColor"><![CDATA[#FFFFFFFF]]></p:property><p:property name="strokeColor"><![CDATA[#000000FF]]></p:property><p:property name="strokeStyle"><![CDATA[0|]]></p:property></p:metadata> + <defs> + <filter height="1.2558399" y="-0.12792" width="1.06396" x="-0.03198" p:name="imageShading" id="imageShading61221683719325"> + <feGaussianBlur stdDeviation="1.3325" in="SourceAlpha"/> + </filter> + <g p:name="container" id="container61221683719325"> + <rect style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0); stroke-opacity: 1; stroke-width: 0pt; fill-opacity: 1;" p:name="bgRect" id="bgRect61221683719325" width="20" height="20" transform="translate(0)"/> + <g p:name="imageContainer" id="imageContainer61221683719325" transform="scale(0.416667)"> + <imag... [truncated message content] |
From: <cra...@us...> - 2009-11-30 19:56:22
|
Revision: 1005 http://cs-project.svn.sourceforge.net/cs-project/?rev=1005&view=rev Author: crazedsanity Date: 2009-11-30 19:56:11 +0000 (Mon, 30 Nov 2009) Log Message: ----------- A text file with random ideas I've spawned over the years. Added Paths: ----------- trunk/2.0/docs/cs-project_ideas.txt Added: trunk/2.0/docs/cs-project_ideas.txt =================================================================== --- trunk/2.0/docs/cs-project_ideas.txt (rev 0) +++ trunk/2.0/docs/cs-project_ideas.txt 2009-11-30 19:56:11 UTC (rev 1005) @@ -0,0 +1,291 @@ + +================================================================================ +Client systems need a "key" (PHP, MD5... something) in order to securely communicate with main cs-project server & verify their identity. +================================================================================ + + + + +================================================================================ +Tasks should create notifications (users associated with project or helpdesk issue). +================================================================================ + + + + +================================================================================ +Should be a panel to display info about users on given project: + * what users are working on + * last login for each user +================================================================================ + + + +================================================================================ +Display user associations as "{username} ({Proper Name})" +================================================================================ + + + +================================================================================ +Send notifications for existing issues/projects when: + * user associated/disassociated + * issue has been assigned + * projects are created/completed. +================================================================================ + + + +================================================================================ +User that performs action to spawn email notification should have option (beside button) to "edit" notification (probably more like add a personal message about it)... this should also be logged somewhere (?). +================================================================================ + + + + +================================================================================ +Summary page: + * should show more reports (more systems should log "report" things) + * allow filtering (change log type, filter on user, date, etc) +================================================================================ + + + + +================================================================================ +File uploads: + * only link to notes + * make notes generic + -- remove "record_id" column from note_table + -- create "linker" table for notes, wherein "type" indicates what the note is linked to (i.e. task, project, issue, etc) + -- convert task comments into notes + +EXAMPLE ("av_check" value indicates whether it was scanned; if it is set, the +file is free of viruses; if not, it should be automatically scanned if there is +a clamscan client available at time of download)::: + + + *** file_table *** +file_id | file_name | av_check | md5sum | encoded_contents +--------+-------------------------+------------+----------------------------------+-------------- + 10 | cs-project_redesign.epz | 2008-09-17 | ddf3bb6a56463b73047398091daec26a | (base64 code) + 20 | cs-project_redesign.png | | ddf3bb6a56463b73047398091daec26a | (base64 code) + 30 | new_logo.png | | ddf3bb6a56463b73047398091daec26a | (base64 code) + + *** note_table *** +note_id | subject | body | created | updated | creator_contact_id | is_solution +--------+-----------------+-------------------------------------------+---------+---------+--------------------+------------ + 200 | Attached File | Filename attached: new_logo.png | | | 101 | f + 201 | Comment | My new design, in Pencil and png formats. | | | 101 | f + + + ** note_file_table *** +note_file_id | note_id | file_id +-------------+---------+--------- + 1 | 200 | 30 + 2 | 201 | 10 + 3 | 201 | 20 + +================================================================================ + + + + + +================================================================================ +Post-upgrade notifications: + * upgrades should be able to specify actions that need to be performed + * notify users of new features (or things that have changed; consider storing so each user can see upon login) +================================================================================ + + + +================================================================================ +#1: This is a logo customized for the active project (the active project in the example is CS-Project) +#2: Admin/group admin goes to the admin tab, which shows extra options for having that title. +#3: Where "group switcher" was now has the "active project switcher" +#4: Preference contains ONLY the user's preferences (no admin stuff) +#5: Admin tab only shows for those with administrative titles associated with their account. +#6: Summary is similar to the v1.x tab, but has information about newly-assigned items, etc (the exclamation shows when there's something new to show--since their last viewing of it). +#7: Overview is where the old "projects" tab was. +#8: Contacts is just like in v1.x, but can show contacts only associated with the current project or ALL of them. +#9: The url no should no longer use project id's, but instead use a human-readable link to the active project (the active project can be switched this way as well). +#10: Issues linked directly to the active project. They should be linked to sub-projects (or "milestones"). Only show if there are applicable issues? +#11: As with issues, tasks linked directly to the main project. Only show if there are applicable tasks? +#12: Documentation is basically notes and uploaded files that help development or are help docs for using the system... the count would probably only include the actual note records, not the files associated with them. NOTE: this could incorporate requirements documentation from that one Tigris.org project... +#13: the main projects beneath the active project are displayed like root projects used to be; progress is updated automatically based on sub-projects. + + + + +Project Leader(s): +Dan Falconer (slaughter) + +Lead Developer(s): +Dan Falconer (slaughter) + +Developers: +Bill Bray (bilfurd) +Jesse Lesperance (jlesperance) +Vikas Rajput (vikasrajput) +================================================================================ + + + +================================================================================ +More Changes for 1.2.x: + * CONFIG CHANGES + -- move config from /CONFIG to /CONFIG/CS-PROJECT + -- add section for cs-content + * Update CS-Content to use a configuration + -- USE CONSTANTS + -- in prepare() (or in some other pre-check), make sure required + constants, such as "SITE_ROOT", are available + -- add considerations for using cs_siteConfig (i.e. check for a constant + "CS-CONTENT_USE_SITECONFIG": a value of false or no constant makes it + need the normal constants; non-false should have the path to the site's + config, and check for "CS-CONTENT_SITECONFIG_SECTION" for where to find + the section [default='CS-CONTENT']) + * Incorporate CS-VersionParse (required for new version of cs-content) + * Incorporate CS-WebDBUpgrade +================================================================================ + + + +================================================================================ +Use API-Style Calls for Interface + +REASONING: + * makes future API integration easier + -- when using an external API, use XML libs to wrap into XML doc + -- encryption can be done via protocol or at the API level + * simplify interface by using standardized calls + +Information: + * GET for retrieving information + * POST for changing information + * Each call has a "type", "name", and "parameters" + +EXAMPLES: +---------- ++ Updating a Project (i.e. projectClass::update_project()): +POST = array( + 'type' => "project", + 'name' => "updateProject", + 'params' => array( + 0 => 101, + 1 => array( + 'project_name' => "New Project Name", + 'ancestry' => "400:101" + ) + ) +); + ++ Updating a Pref: +POST = array( + 'type' => "pref", + 'name' => "update_user_pref", + 'params' => array( + 0 => 101, + 1 => 1 + ) +); + ++ Retrieving All Contacts: +GET = array( + 'type' => "contact", + 'name' => "getAllContacts", + 'params' => NULL +); +================================================================================ + + + +================================================================================ +CS-CONTENT CONFIG PARAMETERS (all are GLOBAL unless otherwise specified): + * SITE_ROOT + -- contentSystemClass.php lines 67-70 + -- cs_fileSystemClass.php lines 38-40 + -- cs_genericPageClass.php lines 62-63 + * TMPLDIR + -- contentSystemClass.php lines 352,437,533,559,588 + * IGNORE_FOLDERS + -- contentSystemClass.php line 88 + * IGNORE_FILES + -- contentSystemClass.php line 87 + * VERSION_FILE_LOCATION (make a small abstract class that extends cs_versionAbstract and sets the version file location directly in the constructor to avoid code duplication) + -- contentSystemClass.php line 112 + -- cs_bbCodeParser.class.php line 33 + -- cs_fileSystemClass.php line 32 + -- cs_genericPageClass.php line 36 + -- cs_globalFunctions.php line 33 + -- cs_phpDB.php line line 36 + -- cs_sessionClass.php line 29 + -- !!! cs_siteConfig.php !!! + -- cs_tabsClass.php line 28 + * INCLUDESDIR + -- contentSystemClass.php lines 346 + * LIBDIR + -- cs_genericPageClass.php line 65 + * DO_NOT_REDIRECT_TO_SCRIPTS + -- cs_genericPageClass.php lines 101-102 + * DROP_GET_VARS_FOR_LOGIN + -- cs_genericPageClass.php lines 107-108 + * MINI-PARSER_DEFAULT_BEGIN (not required) + -- cs_genericPageClass.php lines 236-237 + * MINI-PARSER_DEFAULT_END (not required) + -- cs-genericPageClass.php lines 236-237 +================================================================================ + + + +================================================================================ +Promotion: "Why Simple Upgrades Are So Important" +---- + +So you've got a web application. It is an integral part of your business, and finding bugs means your company's productivity drops sharply or grinds to a halt: you want a fix FAST. + +This is the very reason why upgradability is so important, especially in a web application. As many developers have already experienced, rolling out an update to a database-driven web application which requires a change to the database requires a lot of coordination, usually at least a few minutes of downtime, and lots of careful planning. + +Now let's say you have a web application built by a third party. You've found this bug, and need a fix fast. Let's also say the vendor is very quick to patch the bug and get a new release to you as quickly as possible. Here is what seems to be the most common scenario: + + * back-up database, just in case + * Download the new release + * Install the new release over the top of the old one, or wipe-out your installation & install "from scratch" + * copy old configuration file(s), attempt to update based on vendor's release notes or new example configs + * update license files with existing information + * manually run database schema changes or run a script that does it automatically + * try running the web application again, tweak files until it all works again + * verify the bug has been fixed (all too often, the requested bug has not been fixed, and you'll have to wait for another release) + +There is another, more comforting scenario. One that puts customer's minds at ease and helps system administrators sleep at night. This scenario is one that CS-Project has embraced from the beginning: + + * run command (svn update) to retrieve latest release + * go to web app in browser (or refresh if it's already open) + +This is the point where most people ask, "okay, and then what?" Loading the webpage again automatically spawns an upgrade process. The first person to access the website will cause the upgrade to run, which temporarily blocks others from accessing it: the upgrade is blazing fast, so normally nobody even realizes an upgrade happened, unless they notice the version number changed. + +Seem too simple? Well, CS-Project was built on the idea that upgrading should be part of the process. Software development is a complex process that is often prone to error, so we made sure upgrades are simple, and upgrading is painless and can be done without fear. Changing database schema or smoothing-out invalid data is quick and efficient. + +How do we do it? The basis of the system involves storing two versions: one on the filesystem, indicating the version of the application; the other stored in the database, indicating the version of schema that is running. When the application is updated, the application version becomes higher than the version stored in the database, so the application knows that it should perform an upgrade. + +Each release comes with upgrade scripts for each release, and those scripts are the ones that make the necessary changes to the database (including schema changes) and make necessary changes to the configuration file. + +Remember that problem with upgrading? That scenario was based upon a rare usecase, wherein the customer keeps their app as up-to-date as possible, always installing the latest patch or fix when it becomes available. But what about the more common cases, where the customer doesn't upgrade for months or years? + +CS-Project accounts for that as well. Even if an installation is 50 upgrades behind, upgrading to the most recent release of a given version is simple and painless. The upgrade system runs through all upgrade scripts (not every release has a script) until the database and application match versions. This process generally only takes a few seconds, even on economy or old hardware. +================================================================================ + + + +================================================================================ +(only sort-of related) +CS-PHPXML LOGIC CHANGES (proposal) + +Instead of creating a massive array which differentiates the internal vs. external nature of an item based upon whether the item is all upper or all lower case... well, create a list of all the paths. In this array, one can list values, attributes, etc. + +The only catch is when dealing with tags that have values: if there's a value, I believe it cannot have tags (i.e. paths) beneath it. There would have to be special checks to ensure this doesn't happen. +================================================================================ + + + Property changes on: trunk/2.0/docs/cs-project_ideas.txt ___________________________________________________________________ Added: svn:executable + * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cra...@us...> - 2009-11-30 19:47:52
|
Revision: 1004 http://cs-project.svn.sourceforge.net/cs-project/?rev=1004&view=rev Author: crazedsanity Date: 2009-11-30 19:47:46 +0000 (Mon, 30 Nov 2009) Log Message: ----------- Folder for holding documentation & ideas... plus files containing my own ideas. The *.xmind file contains some brainstorming I was doing as to how to most efficiently setup the database for version 2.0 so as to make the system as extensible as possible. Added Paths: ----------- trunk/2.0/docs/ trunk/2.0/docs/CS-Project Database Design.xmind trunk/2.0/docs/considerations.doc trunk/2.0/docs/natural_URLs.doc Added: trunk/2.0/docs/CS-Project Database Design.xmind =================================================================== (Binary files differ) Property changes on: trunk/2.0/docs/CS-Project Database Design.xmind ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/2.0/docs/considerations.doc =================================================================== (Binary files differ) Property changes on: trunk/2.0/docs/considerations.doc ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/2.0/docs/natural_URLs.doc =================================================================== (Binary files differ) Property changes on: trunk/2.0/docs/natural_URLs.doc ___________________________________________________________________ Added: svn:mime-type + application/octet-stream This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cra...@us...> - 2009-11-30 19:42:47
|
Revision: 1003 http://cs-project.svn.sourceforge.net/cs-project/?rev=1003&view=rev Author: crazedsanity Date: 2009-11-30 19:42:41 +0000 (Mon, 30 Nov 2009) Log Message: ----------- Placeholder for v2.0. Until actual development begins, it will hold ideas & documentation. Added Paths: ----------- trunk/2.0/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cra...@us...> - 2009-10-26 14:57:29
|
Revision: 1002 http://cs-project.svn.sourceforge.net/cs-project/?rev=1002&view=rev Author: crazedsanity Date: 2009-10-26 14:57:16 +0000 (Mon, 26 Oct 2009) Log Message: ----------- *** RELEASE 1.2.0-ALPHA14 *** SUMMARY OF CHANGES::: * fix setting of version string to use VERSION file. Modified Paths: -------------- trunk/1.2/VERSION Modified: trunk/1.2/VERSION =================================================================== --- trunk/1.2/VERSION 2009-10-26 14:53:07 UTC (rev 1001) +++ trunk/1.2/VERSION 2009-10-26 14:57:16 UTC (rev 1002) @@ -1,5 +1,5 @@ $Id:VERSION 628 2007-11-20 16:58:45Z crazedsanity $ -VERSION: 1.2.0-ALPHA12 +VERSION: 1.2.0-ALPHA14 PROJECT: cs-project $HeadURL:https://cs-project.svn.sourceforge.net/svnroot/cs-project/trunk/VERSION $ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cra...@us...> - 2009-10-26 14:53:18
|
Revision: 1001 http://cs-project.svn.sourceforge.net/cs-project/?rev=1001&view=rev Author: crazedsanity Date: 2009-10-26 14:53:07 +0000 (Mon, 26 Oct 2009) Log Message: ----------- Version string now pulled from main VERSION file. /includes/content.inc: * Moved creation of $db, connection of database handle, and setting of the "VERSION_STRING" or "cs-version_string" template vars into a shared include file so it reports the proper version string. /includes/help.inc: * same as content.inc * removed some commented-out code. /includes/login.inc: * same as content.inc * remove setting of cs-project_version template var /includes/setup.inc: * set VERSION_STRING using config::get_version(). /includes/shared.inc [NEW]: * create $db var * connect $db * set VERSION_STRING and cs-version_string template vars using projectClass::get_version() instead of reading from main config file. /lib/config.class.php: * __construct(): -- call set_version_file_location() so code calling it's get_version() or get_project() method (from cs_versionAbstract{}) will get the proper strings returned. /lib/mainRecordClass.php: * MAIN::: -- extends cs_versionAbstract * __construct(): -- call set_version_file_location(). Modified Paths: -------------- trunk/1.2/includes/content.inc trunk/1.2/includes/help.inc trunk/1.2/includes/login.inc trunk/1.2/includes/setup.inc trunk/1.2/lib/config.class.php trunk/1.2/lib/mainRecordClass.php Added Paths: ----------- trunk/1.2/includes/shared.inc Modified: trunk/1.2/includes/content.inc =================================================================== --- trunk/1.2/includes/content.inc 2009-10-26 12:29:02 UTC (rev 1000) +++ trunk/1.2/includes/content.inc 2009-10-26 14:53:07 UTC (rev 1001) @@ -9,10 +9,6 @@ */ -$db = new cs_phpDB; -$db->connect(get_config_db_params()); -$page->db = $db; - $page->session = new Session($page->db); //initialize everything we need to display the page & remember stuff in the session. @@ -22,9 +18,7 @@ $page->ftsSections = $sectionArr; -$page->add_template_var('cs-project_version', VERSION_STRING); - //done with redirection. Here's where we define if they have to be logged-in, and then run the fast_templating engine. //TODO: update this to be "cs-content friendly". :) $mustBeLoggedIn = 1; Modified: trunk/1.2/includes/help.inc =================================================================== --- trunk/1.2/includes/help.inc 2009-10-26 12:29:02 UTC (rev 1000) +++ trunk/1.2/includes/help.inc 2009-10-26 14:53:07 UTC (rev 1001) @@ -4,15 +4,6 @@ */ -$page->add_template_var('cs-project_version', VERSION_STRING); - - -$db = new cs_phpDB; -$db->connect(get_config_db_params()); -$page->db = $db; - - -#$titlePart = NULL; $titlePart = "Help"; if(ISDEVSITE) { Modified: trunk/1.2/includes/login.inc =================================================================== --- trunk/1.2/includes/login.inc 2009-10-26 12:29:02 UTC (rev 1000) +++ trunk/1.2/includes/login.inc 2009-10-26 14:53:07 UTC (rev 1001) @@ -11,11 +11,7 @@ $page->clear_content("header"); -$db = new cs_phpDB; -$db->connect(get_config_db_params()); -$page->db = $db; -$page->add_template_var('cs-project_version', VERSION_STRING); $page->add_template_var('MAINTABLE_EXTRA', 'align="center"'); if(isset($_GET['loginDestination']) && strlen($_GET['loginDestination'])) { Modified: trunk/1.2/includes/setup.inc =================================================================== --- trunk/1.2/includes/setup.inc 2009-10-26 12:29:02 UTC (rev 1000) +++ trunk/1.2/includes/setup.inc 2009-10-26 14:53:07 UTC (rev 1001) @@ -71,7 +71,7 @@ } - $page->add_template_var("VERSION_STRING", read_version_file()); + $page->add_template_var("VERSION_STRING", $configObj->get_version()); $page->rip_all_block_rows('stepData'); $page->clear_content('infobar'); Added: trunk/1.2/includes/shared.inc =================================================================== --- trunk/1.2/includes/shared.inc (rev 0) +++ trunk/1.2/includes/shared.inc 2009-10-26 14:53:07 UTC (rev 1001) @@ -0,0 +1,27 @@ +<?php +/* + * Created on Oct 26, 2009 + * + * SVN INFORMATION::: + * ------------------- + * Last Author::::::::: $Author$ + * Current Revision:::: $Revision$ + * Repository Location: $HeadURL$ + * Last Updated:::::::: $Date$ + */ + + +try { + $db = new cs_phpDB; + $db->connect(get_config_db_params()); + $page->db = $db; + + $tProj = new projectClass($db); + $page->add_template_var('cs-project_version', $tProj->get_version()); + $page->add_template_var('VERSION_STRING', $tProj->get_version()); + unset($tProj); +} +catch(exception $e) { + //nothing to see here, move along (probably not setup yet). +} +?> Property changes on: trunk/1.2/includes/shared.inc ___________________________________________________________________ Added: svn:keywords + Author Revision HeadURL Date Modified: trunk/1.2/lib/config.class.php =================================================================== --- trunk/1.2/lib/config.class.php 2009-10-26 12:29:02 UTC (rev 1000) +++ trunk/1.2/lib/config.class.php 2009-10-26 14:53:07 UTC (rev 1001) @@ -20,6 +20,8 @@ $this->gf = new cs_globalFunctions(); $this->fs = new cs_fileSystem(dirname(__FILE__) .'/..'); + $this->set_version_file_location(dirname(__FILE__) .'/../VERSION'); + $this->fileName = dirname(__FILE__) .'/'. CONFIG_FILENAME; if(!is_null($fileName) && strlen($fileName)) { $this->fileName = $fileName; Modified: trunk/1.2/lib/mainRecordClass.php =================================================================== --- trunk/1.2/lib/mainRecordClass.php 2009-10-26 12:29:02 UTC (rev 1000) +++ trunk/1.2/lib/mainRecordClass.php 2009-10-26 14:53:07 UTC (rev 1001) @@ -12,7 +12,7 @@ */ -class mainRecord { +class mainRecord extends cs_versionAbstract { public $db; public $isHelpdeskIssue = FALSE; @@ -31,6 +31,8 @@ //========================================================================= function __construct() { + $this->set_version_file_location(dirname(__FILE__) .'/../VERSION'); + //these are fairly generic, & can be updated easily. $this->updateableFieldsArr = array( 'group_id' => 'numeric', This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cra...@us...> - 2009-10-26 12:29:16
|
Revision: 1000 http://cs-project.svn.sourceforge.net/cs-project/?rev=1000&view=rev Author: crazedsanity Date: 2009-10-26 12:29:02 +0000 (Mon, 26 Oct 2009) Log Message: ----------- Add project name to VERSION file for the purposes of upgrading. Modified Paths: -------------- releases/1.2/VERSION Modified: releases/1.2/VERSION =================================================================== --- releases/1.2/VERSION 2009-10-26 03:28:08 UTC (rev 999) +++ releases/1.2/VERSION 2009-10-26 12:29:02 UTC (rev 1000) @@ -1,4 +1,5 @@ $Id:VERSION 628 2007-11-20 16:58:45Z crazedsanity $ VERSION: 1.2.0-ALPHA13 +PROJECT: cs-project $HeadURL:https://cs-project.svn.sourceforge.net/svnroot/cs-project/trunk/VERSION $ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cra...@us...> - 2009-10-26 03:28:14
|
Revision: 999 http://cs-project.svn.sourceforge.net/cs-project/?rev=999&view=rev Author: crazedsanity Date: 2009-10-26 03:28:08 +0000 (Mon, 26 Oct 2009) Log Message: ----------- *** RELEASE 1.2.0-ALPHA13 *** NOTE: this also includes 1.2.0-ALPHA12, which was not officially released. SUMMARY OF CHANGES::: * add CAPTCHA for spam blocking on external interface (#304) * fixed a pass-by-reference error * throw exception instead of setting a message for missing templates (#253) * removed unused tests * fix some upgrade scripts to use new library names * fix exception when no config file exists * Update setup to handle new config, fix accidental redirection after setup. * Fix check for writability of lib to rw, implement tests for external libs. * Remove the setup filename instead of it's location (and only if it exists). * Formatting, set assigned user when solving (#252), minor wording fix (#195). * convert all *.png files to *.gif for Internet Explorer compatibility * remove some unnecessary code referring to an invalid image location. * Make sure the "/" URL works properly. * fix problem with reading the main config.xml layout... * move temporary class names to lib directory for proper __autoload()ing. * On setup step 5, give more specific messages & display fail count. * Fix issue #299 (Helpdesk Search No Longer Works). * Use cs-content's __autoload.php, minor updates for cs_webdbupgrade. * Update external lib requirements & add config items for cs-webapplibs. Modified Paths: -------------- releases/1.2/VERSION Modified: releases/1.2/VERSION =================================================================== --- releases/1.2/VERSION 2009-10-26 03:26:37 UTC (rev 998) +++ releases/1.2/VERSION 2009-10-26 03:28:08 UTC (rev 999) @@ -1,4 +1,4 @@ $Id:VERSION 628 2007-11-20 16:58:45Z crazedsanity $ -VERSION: 1.2.0-ALPHA11 +VERSION: 1.2.0-ALPHA13 $HeadURL:https://cs-project.svn.sourceforge.net/svnroot/cs-project/trunk/VERSION $ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cra...@us...> - 2009-10-26 03:26:52
|
Revision: 998 http://cs-project.svn.sourceforge.net/cs-project/?rev=998&view=rev Author: crazedsanity Date: 2009-10-26 03:26:37 +0000 (Mon, 26 Oct 2009) Log Message: ----------- v1.2.0-ALPHA13 part 4. Modified Paths: -------------- releases/1.2/public_html/.htaccess releases/1.2/public_html/index.php Added Paths: ----------- releases/1.2/public_html/images/bullet-round.gif releases/1.2/public_html/images/icon-help.gif releases/1.2/public_html/images/icons/12-em-check.gif releases/1.2/public_html/images/icons/12-em-cross.gif releases/1.2/public_html/images/icons/12-em-down.gif releases/1.2/public_html/images/icons/12-em-pencil.gif releases/1.2/public_html/images/icons/12-em-plus.gif releases/1.2/public_html/images/icons/12-em-up.gif releases/1.2/public_html/images/icons/16-arrow-down.gif releases/1.2/public_html/images/icons/16-arrow-left.gif releases/1.2/public_html/images/icons/16-arrow-right.gif releases/1.2/public_html/images/icons/16-arrow-up.gif releases/1.2/public_html/images/icons/16-circle-blue-add.gif releases/1.2/public_html/images/icons/16-circle-blue-check.gif releases/1.2/public_html/images/icons/16-circle-blue-delete.gif releases/1.2/public_html/images/icons/16-circle-blue-remove.gif releases/1.2/public_html/images/icons/16-circle-blue.gif releases/1.2/public_html/images/icons/16-circle-green-add.gif releases/1.2/public_html/images/icons/16-circle-green-check.gif releases/1.2/public_html/images/icons/16-circle-green-delete.gif releases/1.2/public_html/images/icons/16-circle-green-remove.gif releases/1.2/public_html/images/icons/16-circle-green.gif releases/1.2/public_html/images/icons/16-circle-red-add.gif releases/1.2/public_html/images/icons/16-circle-red-check.gif releases/1.2/public_html/images/icons/16-circle-red-delete.gif releases/1.2/public_html/images/icons/16-circle-red-remove.gif releases/1.2/public_html/images/icons/16-circle-red.gif releases/1.2/public_html/images/icons/16-clock.gif releases/1.2/public_html/images/icons/16-cube-blue.gif releases/1.2/public_html/images/icons/16-cube-green.gif releases/1.2/public_html/images/icons/16-cube-red.gif releases/1.2/public_html/images/icons/16-em-check.gif releases/1.2/public_html/images/icons/16-em-cross.gif releases/1.2/public_html/images/icons/16-em-down.gif releases/1.2/public_html/images/icons/16-em-open.gif releases/1.2/public_html/images/icons/16-em-pencil.gif releases/1.2/public_html/images/icons/16-em-plus.gif releases/1.2/public_html/images/icons/16-file-archive.gif releases/1.2/public_html/images/icons/16-file-page.gif releases/1.2/public_html/images/icons/16-heart-gold-l.gif releases/1.2/public_html/images/icons/16-heart-gold-m.gif releases/1.2/public_html/images/icons/16-heart-gold-s.gif releases/1.2/public_html/images/icons/16-heart-gold-xs.gif releases/1.2/public_html/images/icons/16-heart-gold-xxs.gif releases/1.2/public_html/images/icons/16-heart-red-l.gif releases/1.2/public_html/images/icons/16-heart-red-m.gif releases/1.2/public_html/images/icons/16-heart-red-s.gif releases/1.2/public_html/images/icons/16-heart-red-xs.gif releases/1.2/public_html/images/icons/16-heart-red-xxs.gif releases/1.2/public_html/images/icons/16-heart-silver-l.gif releases/1.2/public_html/images/icons/16-heart-silver-m.gif releases/1.2/public_html/images/icons/16-heart-silver-s.gif releases/1.2/public_html/images/icons/16-heart-silver-xs.gif releases/1.2/public_html/images/icons/16-heart-silver-xxs.gif releases/1.2/public_html/images/icons/16-image-add.gif releases/1.2/public_html/images/icons/16-image-check.gif releases/1.2/public_html/images/icons/16-image-remove.gif releases/1.2/public_html/images/icons/16-image.gif releases/1.2/public_html/images/icons/16-member-add.gif releases/1.2/public_html/images/icons/16-member-heart.gif releases/1.2/public_html/images/icons/16-member-profile.gif releases/1.2/public_html/images/icons/16-member-remove.gif releases/1.2/public_html/images/icons/16-member.gif releases/1.2/public_html/images/icons/16-message-info.gif releases/1.2/public_html/images/icons/16-message-warn.gif releases/1.2/public_html/images/icons/16-security-key.gif releases/1.2/public_html/images/icons/16-security-lock-open.gif releases/1.2/public_html/images/icons/16-security-lock.gif releases/1.2/public_html/images/icons/16-square-blue-add.gif releases/1.2/public_html/images/icons/16-square-blue-check.gif releases/1.2/public_html/images/icons/16-square-blue-delete.gif releases/1.2/public_html/images/icons/16-square-blue-remove.gif releases/1.2/public_html/images/icons/16-square-blue.gif releases/1.2/public_html/images/icons/16-square-green-add.gif releases/1.2/public_html/images/icons/16-square-green-check.gif releases/1.2/public_html/images/icons/16-square-green-delete.gif releases/1.2/public_html/images/icons/16-square-green-remove.gif releases/1.2/public_html/images/icons/16-square-green.gif releases/1.2/public_html/images/icons/16-square-red-add.gif releases/1.2/public_html/images/icons/16-square-red-check.gif releases/1.2/public_html/images/icons/16-square-red-delete.gif releases/1.2/public_html/images/icons/16-square-red-remove.gif releases/1.2/public_html/images/icons/16-square-red.gif releases/1.2/public_html/images/icons/16-star-cold.gif releases/1.2/public_html/images/icons/16-star-hot.gif releases/1.2/public_html/images/icons/16-tag-add.gif releases/1.2/public_html/images/icons/16-tag-check.gif releases/1.2/public_html/images/icons/16-tag-cold.gif releases/1.2/public_html/images/icons/16-tag-cross.gif releases/1.2/public_html/images/icons/16-tag-hot.gif releases/1.2/public_html/images/icons/16-tag-pencil.gif releases/1.2/public_html/images/icons/16-tool-a.gif releases/1.2/public_html/images/icons/16-tool-b.gif releases/1.2/public_html/images/icons/16-tool-c.gif releases/1.2/public_html/images/icons/16-tool-d.gif releases/1.2/public_html/images/icons/16-zoom.gif releases/1.2/public_html/images/icons/24-arrow-back.gif releases/1.2/public_html/images/icons/24-arrow-first.gif releases/1.2/public_html/images/icons/24-arrow-forward.gif releases/1.2/public_html/images/icons/24-arrow-last.gif releases/1.2/public_html/images/icons/24-arrow-next.gif releases/1.2/public_html/images/icons/24-arrow-previous.gif releases/1.2/public_html/images/icons/24-book-blue-add.gif releases/1.2/public_html/images/icons/24-book-blue-check.gif releases/1.2/public_html/images/icons/24-book-blue-mark.gif releases/1.2/public_html/images/icons/24-book-blue-open.gif releases/1.2/public_html/images/icons/24-book-blue-remove.gif releases/1.2/public_html/images/icons/24-book-blue.gif releases/1.2/public_html/images/icons/24-book-green-add.gif releases/1.2/public_html/images/icons/24-book-green-check.gif releases/1.2/public_html/images/icons/24-book-green-mark.gif releases/1.2/public_html/images/icons/24-book-green-open.gif releases/1.2/public_html/images/icons/24-book-green-remove.gif releases/1.2/public_html/images/icons/24-book-green.gif releases/1.2/public_html/images/icons/24-book-red-add.gif releases/1.2/public_html/images/icons/24-book-red-check.gif releases/1.2/public_html/images/icons/24-book-red-mark.gif releases/1.2/public_html/images/icons/24-book-red-open.gif releases/1.2/public_html/images/icons/24-book-red-remove.gif releases/1.2/public_html/images/icons/24-book-red.gif releases/1.2/public_html/images/icons/24-columns.gif releases/1.2/public_html/images/icons/24-control-pause.gif releases/1.2/public_html/images/icons/24-control-stop.gif releases/1.2/public_html/images/icons/24-em-check.gif releases/1.2/public_html/images/icons/24-em-cross.gif releases/1.2/public_html/images/icons/24-em-down.gif releases/1.2/public_html/images/icons/24-em-plus.gif releases/1.2/public_html/images/icons/24-em-up.gif releases/1.2/public_html/images/icons/24-frame-add.gif releases/1.2/public_html/images/icons/24-frame-close.gif releases/1.2/public_html/images/icons/24-frame-open.gif releases/1.2/public_html/images/icons/24-frame.gif releases/1.2/public_html/images/icons/24-heart-gold.gif releases/1.2/public_html/images/icons/24-heart-red.gif releases/1.2/public_html/images/icons/24-heart-silver.gif releases/1.2/public_html/images/icons/24-image-add.gif releases/1.2/public_html/images/icons/24-image-check.gif releases/1.2/public_html/images/icons/24-image-open.gif releases/1.2/public_html/images/icons/24-image-remove.gif releases/1.2/public_html/images/icons/24-image.gif releases/1.2/public_html/images/icons/24-imageset-add.gif releases/1.2/public_html/images/icons/24-imageset-check.gif releases/1.2/public_html/images/icons/24-imageset-open.gif releases/1.2/public_html/images/icons/24-imageset-remove.gif releases/1.2/public_html/images/icons/24-imageset.gif releases/1.2/public_html/images/icons/24-member-add.gif releases/1.2/public_html/images/icons/24-member-heart.gif releases/1.2/public_html/images/icons/24-member-remove.gif releases/1.2/public_html/images/icons/24-member.gif releases/1.2/public_html/images/icons/24-message-info.gif releases/1.2/public_html/images/icons/24-message-warn.gif releases/1.2/public_html/images/icons/24-security-key.gif releases/1.2/public_html/images/icons/24-security-lock-open.gif releases/1.2/public_html/images/icons/24-security-lock.gif releases/1.2/public_html/images/icons/24-settings-blue.gif releases/1.2/public_html/images/icons/24-settings-orange.gif releases/1.2/public_html/images/icons/24-settings-silver.gif releases/1.2/public_html/images/icons/24-settings.gif releases/1.2/public_html/images/icons/24-sidebar.gif releases/1.2/public_html/images/icons/24-tab-add.gif releases/1.2/public_html/images/icons/24-tab-close.gif releases/1.2/public_html/images/icons/24-tab-open.gif releases/1.2/public_html/images/icons/24-tab.gif releases/1.2/public_html/images/icons/24-tag-add.gif releases/1.2/public_html/images/icons/24-tag-check.gif releases/1.2/public_html/images/icons/24-tag-cold.gif releases/1.2/public_html/images/icons/24-tag-hot.gif releases/1.2/public_html/images/icons/24-tag-manager.gif releases/1.2/public_html/images/icons/24-tag-pencil.gif releases/1.2/public_html/images/icons/24-tag-remove.gif releases/1.2/public_html/images/icons/24-tool-a.gif releases/1.2/public_html/images/icons/24-tool-b.gif releases/1.2/public_html/images/icons/24-tool-c.gif releases/1.2/public_html/images/icons/24-tools.gif releases/1.2/public_html/images/icons/24-zoom-actual.gif releases/1.2/public_html/images/icons/24-zoom-fill.gif releases/1.2/public_html/images/icons/24-zoom-in.gif releases/1.2/public_html/images/icons/24-zoom-out.gif releases/1.2/public_html/images/icons/24-zoom.gif releases/1.2/public_html/images/icons/8-em-check.gif releases/1.2/public_html/images/icons/8-em-cross.gif releases/1.2/public_html/images/icons/8-em-heart.gif releases/1.2/public_html/images/icons/8-em-pencil.gif releases/1.2/public_html/images/icons/8-em-plus.gif releases/1.2/public_html/images/message_icons/error.gif releases/1.2/public_html/images/message_icons/fatal.gif releases/1.2/public_html/images/message_icons/info.gif releases/1.2/public_html/images/message_icons/notice.gif releases/1.2/public_html/images/message_icons/status.gif Removed Paths: ------------- releases/1.2/public_html/images/bullet-round.png releases/1.2/public_html/images/icon-help.png releases/1.2/public_html/images/icons/12-em-check.png releases/1.2/public_html/images/icons/12-em-cross.png releases/1.2/public_html/images/icons/12-em-down.png releases/1.2/public_html/images/icons/12-em-pencil.png releases/1.2/public_html/images/icons/12-em-plus.png releases/1.2/public_html/images/icons/12-em-up.png releases/1.2/public_html/images/icons/16-arrow-down.png releases/1.2/public_html/images/icons/16-arrow-left.png releases/1.2/public_html/images/icons/16-arrow-right.png releases/1.2/public_html/images/icons/16-arrow-up.png releases/1.2/public_html/images/icons/16-circle-blue-add.png releases/1.2/public_html/images/icons/16-circle-blue-check.png releases/1.2/public_html/images/icons/16-circle-blue-delete.png releases/1.2/public_html/images/icons/16-circle-blue-remove.png releases/1.2/public_html/images/icons/16-circle-blue.png releases/1.2/public_html/images/icons/16-circle-green-add.png releases/1.2/public_html/images/icons/16-circle-green-check.png releases/1.2/public_html/images/icons/16-circle-green-delete.png releases/1.2/public_html/images/icons/16-circle-green-remove.png releases/1.2/public_html/images/icons/16-circle-green.png releases/1.2/public_html/images/icons/16-circle-red-add.png releases/1.2/public_html/images/icons/16-circle-red-check.png releases/1.2/public_html/images/icons/16-circle-red-delete.png releases/1.2/public_html/images/icons/16-circle-red-remove.png releases/1.2/public_html/images/icons/16-circle-red.png releases/1.2/public_html/images/icons/16-clock.png releases/1.2/public_html/images/icons/16-cube-blue.png releases/1.2/public_html/images/icons/16-cube-green.png releases/1.2/public_html/images/icons/16-cube-red.png releases/1.2/public_html/images/icons/16-em-check.png releases/1.2/public_html/images/icons/16-em-cross.png releases/1.2/public_html/images/icons/16-em-down.png releases/1.2/public_html/images/icons/16-em-open.png releases/1.2/public_html/images/icons/16-em-pencil.png releases/1.2/public_html/images/icons/16-em-plus.png releases/1.2/public_html/images/icons/16-file-archive.png releases/1.2/public_html/images/icons/16-file-page.png releases/1.2/public_html/images/icons/16-heart-gold-l.png releases/1.2/public_html/images/icons/16-heart-gold-m.png releases/1.2/public_html/images/icons/16-heart-gold-s.png releases/1.2/public_html/images/icons/16-heart-gold-xs.png releases/1.2/public_html/images/icons/16-heart-gold-xxs.png releases/1.2/public_html/images/icons/16-heart-red-l.png releases/1.2/public_html/images/icons/16-heart-red-m.png releases/1.2/public_html/images/icons/16-heart-red-s.png releases/1.2/public_html/images/icons/16-heart-red-xs.png releases/1.2/public_html/images/icons/16-heart-red-xxs.png releases/1.2/public_html/images/icons/16-heart-silver-l.png releases/1.2/public_html/images/icons/16-heart-silver-m.png releases/1.2/public_html/images/icons/16-heart-silver-s.png releases/1.2/public_html/images/icons/16-heart-silver-xs.png releases/1.2/public_html/images/icons/16-heart-silver-xxs.png releases/1.2/public_html/images/icons/16-image-add.png releases/1.2/public_html/images/icons/16-image-check.png releases/1.2/public_html/images/icons/16-image-remove.png releases/1.2/public_html/images/icons/16-image.png releases/1.2/public_html/images/icons/16-member-add.png releases/1.2/public_html/images/icons/16-member-heart.png releases/1.2/public_html/images/icons/16-member-profile.png releases/1.2/public_html/images/icons/16-member-remove.png releases/1.2/public_html/images/icons/16-member.png releases/1.2/public_html/images/icons/16-message-info.png releases/1.2/public_html/images/icons/16-message-warn.png releases/1.2/public_html/images/icons/16-security-key.png releases/1.2/public_html/images/icons/16-security-lock-open.png releases/1.2/public_html/images/icons/16-security-lock.png releases/1.2/public_html/images/icons/16-square-blue-add.png releases/1.2/public_html/images/icons/16-square-blue-check.png releases/1.2/public_html/images/icons/16-square-blue-delete.png releases/1.2/public_html/images/icons/16-square-blue-remove.png releases/1.2/public_html/images/icons/16-square-blue.png releases/1.2/public_html/images/icons/16-square-green-add.png releases/1.2/public_html/images/icons/16-square-green-check.png releases/1.2/public_html/images/icons/16-square-green-delete.png releases/1.2/public_html/images/icons/16-square-green-remove.png releases/1.2/public_html/images/icons/16-square-green.png releases/1.2/public_html/images/icons/16-square-red-add.png releases/1.2/public_html/images/icons/16-square-red-check.png releases/1.2/public_html/images/icons/16-square-red-delete.png releases/1.2/public_html/images/icons/16-square-red-remove.png releases/1.2/public_html/images/icons/16-square-red.png releases/1.2/public_html/images/icons/16-star-cold.png releases/1.2/public_html/images/icons/16-star-hot.png releases/1.2/public_html/images/icons/16-tag-add.png releases/1.2/public_html/images/icons/16-tag-check.png releases/1.2/public_html/images/icons/16-tag-cold.png releases/1.2/public_html/images/icons/16-tag-cross.png releases/1.2/public_html/images/icons/16-tag-hot.png releases/1.2/public_html/images/icons/16-tag-pencil.png releases/1.2/public_html/images/icons/16-tool-a.png releases/1.2/public_html/images/icons/16-tool-b.png releases/1.2/public_html/images/icons/16-tool-c.png releases/1.2/public_html/images/icons/16-tool-d.png releases/1.2/public_html/images/icons/16-zoom.png releases/1.2/public_html/images/icons/24-arrow-back.png releases/1.2/public_html/images/icons/24-arrow-first.png releases/1.2/public_html/images/icons/24-arrow-forward.png releases/1.2/public_html/images/icons/24-arrow-last.png releases/1.2/public_html/images/icons/24-arrow-next.png releases/1.2/public_html/images/icons/24-arrow-previous.png releases/1.2/public_html/images/icons/24-book-blue-add.png releases/1.2/public_html/images/icons/24-book-blue-check.png releases/1.2/public_html/images/icons/24-book-blue-mark.png releases/1.2/public_html/images/icons/24-book-blue-open.png releases/1.2/public_html/images/icons/24-book-blue-remove.png releases/1.2/public_html/images/icons/24-book-blue.png releases/1.2/public_html/images/icons/24-book-green-add.png releases/1.2/public_html/images/icons/24-book-green-check.png releases/1.2/public_html/images/icons/24-book-green-mark.png releases/1.2/public_html/images/icons/24-book-green-open.png releases/1.2/public_html/images/icons/24-book-green-remove.png releases/1.2/public_html/images/icons/24-book-green.png releases/1.2/public_html/images/icons/24-book-red-add.png releases/1.2/public_html/images/icons/24-book-red-check.png releases/1.2/public_html/images/icons/24-book-red-mark.png releases/1.2/public_html/images/icons/24-book-red-open.png releases/1.2/public_html/images/icons/24-book-red-remove.png releases/1.2/public_html/images/icons/24-book-red.png releases/1.2/public_html/images/icons/24-columns.png releases/1.2/public_html/images/icons/24-control-pause.png releases/1.2/public_html/images/icons/24-control-stop.png releases/1.2/public_html/images/icons/24-em-check.png releases/1.2/public_html/images/icons/24-em-cross.png releases/1.2/public_html/images/icons/24-em-down.png releases/1.2/public_html/images/icons/24-em-plus.png releases/1.2/public_html/images/icons/24-em-up.png releases/1.2/public_html/images/icons/24-frame-add.png releases/1.2/public_html/images/icons/24-frame-close.png releases/1.2/public_html/images/icons/24-frame-open.png releases/1.2/public_html/images/icons/24-frame.png releases/1.2/public_html/images/icons/24-heart-gold.png releases/1.2/public_html/images/icons/24-heart-red.png releases/1.2/public_html/images/icons/24-heart-silver.png releases/1.2/public_html/images/icons/24-image-add.png releases/1.2/public_html/images/icons/24-image-check.png releases/1.2/public_html/images/icons/24-image-open.png releases/1.2/public_html/images/icons/24-image-remove.png releases/1.2/public_html/images/icons/24-image.png releases/1.2/public_html/images/icons/24-imageset-add.png releases/1.2/public_html/images/icons/24-imageset-check.png releases/1.2/public_html/images/icons/24-imageset-open.png releases/1.2/public_html/images/icons/24-imageset-remove.png releases/1.2/public_html/images/icons/24-imageset.png releases/1.2/public_html/images/icons/24-member-add.png releases/1.2/public_html/images/icons/24-member-heart.png releases/1.2/public_html/images/icons/24-member-remove.png releases/1.2/public_html/images/icons/24-member.png releases/1.2/public_html/images/icons/24-message-info.png releases/1.2/public_html/images/icons/24-message-warn.png releases/1.2/public_html/images/icons/24-security-key.png releases/1.2/public_html/images/icons/24-security-lock-open.png releases/1.2/public_html/images/icons/24-security-lock.png releases/1.2/public_html/images/icons/24-settings-blue.png releases/1.2/public_html/images/icons/24-settings-orange.png releases/1.2/public_html/images/icons/24-settings-silver.png releases/1.2/public_html/images/icons/24-settings.png releases/1.2/public_html/images/icons/24-sidebar.png releases/1.2/public_html/images/icons/24-tab-add.png releases/1.2/public_html/images/icons/24-tab-close.png releases/1.2/public_html/images/icons/24-tab-open.png releases/1.2/public_html/images/icons/24-tab.png releases/1.2/public_html/images/icons/24-tag-add.png releases/1.2/public_html/images/icons/24-tag-check.png releases/1.2/public_html/images/icons/24-tag-cold.png releases/1.2/public_html/images/icons/24-tag-hot.png releases/1.2/public_html/images/icons/24-tag-manager.png releases/1.2/public_html/images/icons/24-tag-pencil.png releases/1.2/public_html/images/icons/24-tag-remove.png releases/1.2/public_html/images/icons/24-tool-a.png releases/1.2/public_html/images/icons/24-tool-b.png releases/1.2/public_html/images/icons/24-tool-c.png releases/1.2/public_html/images/icons/24-tools.png releases/1.2/public_html/images/icons/24-zoom-actual.png releases/1.2/public_html/images/icons/24-zoom-fill.png releases/1.2/public_html/images/icons/24-zoom-in.png releases/1.2/public_html/images/icons/24-zoom-out.png releases/1.2/public_html/images/icons/24-zoom.png releases/1.2/public_html/images/icons/8-em-check.png releases/1.2/public_html/images/icons/8-em-cross.png releases/1.2/public_html/images/icons/8-em-heart.png releases/1.2/public_html/images/icons/8-em-pencil.png releases/1.2/public_html/images/icons/8-em-plus.png releases/1.2/public_html/images/message_icons/error.png releases/1.2/public_html/images/message_icons/fatal.png releases/1.2/public_html/images/message_icons/info.png releases/1.2/public_html/images/message_icons/notice.png releases/1.2/public_html/images/message_icons/status.png Modified: releases/1.2/public_html/.htaccess =================================================================== --- releases/1.2/public_html/.htaccess 2009-10-26 03:16:07 UTC (rev 997) +++ releases/1.2/public_html/.htaccess 2009-10-26 03:26:37 UTC (rev 998) @@ -1,7 +1,7 @@ php_value include_path ".:./lib:../lib/:../../lib" php_value session.auto_start 1 -DirectoryIndex content content.php index.php index.html +DirectoryIndex index.php content content.php index.html <files content> ForceType application/x-httpd-php Copied: releases/1.2/public_html/images/bullet-round.gif (from rev 992, trunk/1.2/public_html/images/bullet-round.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/bullet-round.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icon-help.gif (from rev 992, trunk/1.2/public_html/images/icon-help.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icon-help.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/12-em-check.gif (from rev 992, trunk/1.2/public_html/images/icons/12-em-check.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/12-em-check.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/12-em-cross.gif (from rev 992, trunk/1.2/public_html/images/icons/12-em-cross.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/12-em-cross.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/12-em-down.gif (from rev 992, trunk/1.2/public_html/images/icons/12-em-down.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/12-em-down.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/12-em-pencil.gif (from rev 992, trunk/1.2/public_html/images/icons/12-em-pencil.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/12-em-pencil.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/12-em-plus.gif (from rev 992, trunk/1.2/public_html/images/icons/12-em-plus.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/12-em-plus.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/12-em-up.gif (from rev 992, trunk/1.2/public_html/images/icons/12-em-up.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/12-em-up.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-arrow-down.gif (from rev 992, trunk/1.2/public_html/images/icons/16-arrow-down.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-arrow-down.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-arrow-left.gif (from rev 992, trunk/1.2/public_html/images/icons/16-arrow-left.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-arrow-left.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-arrow-right.gif (from rev 992, trunk/1.2/public_html/images/icons/16-arrow-right.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-arrow-right.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-arrow-up.gif (from rev 992, trunk/1.2/public_html/images/icons/16-arrow-up.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-arrow-up.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-circle-blue-add.gif (from rev 992, trunk/1.2/public_html/images/icons/16-circle-blue-add.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-circle-blue-add.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-circle-blue-check.gif (from rev 992, trunk/1.2/public_html/images/icons/16-circle-blue-check.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-circle-blue-check.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-circle-blue-delete.gif (from rev 992, trunk/1.2/public_html/images/icons/16-circle-blue-delete.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-circle-blue-delete.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-circle-blue-remove.gif (from rev 992, trunk/1.2/public_html/images/icons/16-circle-blue-remove.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-circle-blue-remove.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-circle-blue.gif (from rev 992, trunk/1.2/public_html/images/icons/16-circle-blue.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-circle-blue.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-circle-green-add.gif (from rev 992, trunk/1.2/public_html/images/icons/16-circle-green-add.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-circle-green-add.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-circle-green-check.gif (from rev 992, trunk/1.2/public_html/images/icons/16-circle-green-check.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-circle-green-check.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-circle-green-delete.gif (from rev 992, trunk/1.2/public_html/images/icons/16-circle-green-delete.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-circle-green-delete.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-circle-green-remove.gif (from rev 992, trunk/1.2/public_html/images/icons/16-circle-green-remove.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-circle-green-remove.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-circle-green.gif (from rev 992, trunk/1.2/public_html/images/icons/16-circle-green.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-circle-green.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-circle-red-add.gif (from rev 992, trunk/1.2/public_html/images/icons/16-circle-red-add.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-circle-red-add.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-circle-red-check.gif (from rev 992, trunk/1.2/public_html/images/icons/16-circle-red-check.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-circle-red-check.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-circle-red-delete.gif (from rev 992, trunk/1.2/public_html/images/icons/16-circle-red-delete.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-circle-red-delete.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-circle-red-remove.gif (from rev 992, trunk/1.2/public_html/images/icons/16-circle-red-remove.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-circle-red-remove.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-circle-red.gif (from rev 992, trunk/1.2/public_html/images/icons/16-circle-red.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-circle-red.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-clock.gif (from rev 992, trunk/1.2/public_html/images/icons/16-clock.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-clock.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-cube-blue.gif (from rev 992, trunk/1.2/public_html/images/icons/16-cube-blue.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-cube-blue.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-cube-green.gif (from rev 992, trunk/1.2/public_html/images/icons/16-cube-green.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-cube-green.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-cube-red.gif (from rev 992, trunk/1.2/public_html/images/icons/16-cube-red.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-cube-red.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-em-check.gif (from rev 992, trunk/1.2/public_html/images/icons/16-em-check.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-em-check.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-em-cross.gif (from rev 992, trunk/1.2/public_html/images/icons/16-em-cross.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-em-cross.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-em-down.gif (from rev 992, trunk/1.2/public_html/images/icons/16-em-down.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-em-down.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-em-open.gif (from rev 992, trunk/1.2/public_html/images/icons/16-em-open.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-em-open.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-em-pencil.gif (from rev 992, trunk/1.2/public_html/images/icons/16-em-pencil.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-em-pencil.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-em-plus.gif (from rev 992, trunk/1.2/public_html/images/icons/16-em-plus.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-em-plus.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-file-archive.gif (from rev 992, trunk/1.2/public_html/images/icons/16-file-archive.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-file-archive.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-file-page.gif (from rev 992, trunk/1.2/public_html/images/icons/16-file-page.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-file-page.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-heart-gold-l.gif (from rev 992, trunk/1.2/public_html/images/icons/16-heart-gold-l.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-heart-gold-l.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-heart-gold-m.gif (from rev 992, trunk/1.2/public_html/images/icons/16-heart-gold-m.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-heart-gold-m.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-heart-gold-s.gif (from rev 992, trunk/1.2/public_html/images/icons/16-heart-gold-s.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-heart-gold-s.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-heart-gold-xs.gif (from rev 992, trunk/1.2/public_html/images/icons/16-heart-gold-xs.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-heart-gold-xs.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-heart-gold-xxs.gif (from rev 992, trunk/1.2/public_html/images/icons/16-heart-gold-xxs.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-heart-gold-xxs.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-heart-red-l.gif (from rev 992, trunk/1.2/public_html/images/icons/16-heart-red-l.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-heart-red-l.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-heart-red-m.gif (from rev 992, trunk/1.2/public_html/images/icons/16-heart-red-m.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-heart-red-m.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-heart-red-s.gif (from rev 992, trunk/1.2/public_html/images/icons/16-heart-red-s.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-heart-red-s.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-heart-red-xs.gif (from rev 992, trunk/1.2/public_html/images/icons/16-heart-red-xs.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-heart-red-xs.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-heart-red-xxs.gif (from rev 992, trunk/1.2/public_html/images/icons/16-heart-red-xxs.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-heart-red-xxs.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-heart-silver-l.gif (from rev 992, trunk/1.2/public_html/images/icons/16-heart-silver-l.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-heart-silver-l.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-heart-silver-m.gif (from rev 992, trunk/1.2/public_html/images/icons/16-heart-silver-m.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-heart-silver-m.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-heart-silver-s.gif (from rev 992, trunk/1.2/public_html/images/icons/16-heart-silver-s.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-heart-silver-s.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-heart-silver-xs.gif (from rev 992, trunk/1.2/public_html/images/icons/16-heart-silver-xs.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-heart-silver-xs.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-heart-silver-xxs.gif (from rev 992, trunk/1.2/public_html/images/icons/16-heart-silver-xxs.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-heart-silver-xxs.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-image-add.gif (from rev 992, trunk/1.2/public_html/images/icons/16-image-add.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-image-add.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-image-check.gif (from rev 992, trunk/1.2/public_html/images/icons/16-image-check.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-image-check.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-image-remove.gif (from rev 992, trunk/1.2/public_html/images/icons/16-image-remove.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-image-remove.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-image.gif (from rev 992, trunk/1.2/public_html/images/icons/16-image.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-image.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-member-add.gif (from rev 992, trunk/1.2/public_html/images/icons/16-member-add.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-member-add.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-member-heart.gif (from rev 992, trunk/1.2/public_html/images/icons/16-member-heart.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-member-heart.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-member-profile.gif (from rev 992, trunk/1.2/public_html/images/icons/16-member-profile.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-member-profile.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-member-remove.gif (from rev 992, trunk/1.2/public_html/images/icons/16-member-remove.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-member-remove.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-member.gif (from rev 992, trunk/1.2/public_html/images/icons/16-member.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-member.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-message-info.gif (from rev 992, trunk/1.2/public_html/images/icons/16-message-info.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-message-info.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-message-warn.gif (from rev 992, trunk/1.2/public_html/images/icons/16-message-warn.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-message-warn.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-security-key.gif (from rev 992, trunk/1.2/public_html/images/icons/16-security-key.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-security-key.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-security-lock-open.gif (from rev 992, trunk/1.2/public_html/images/icons/16-security-lock-open.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-security-lock-open.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-security-lock.gif (from rev 992, trunk/1.2/public_html/images/icons/16-security-lock.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-security-lock.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-square-blue-add.gif (from rev 992, trunk/1.2/public_html/images/icons/16-square-blue-add.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-square-blue-add.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-square-blue-check.gif (from rev 992, trunk/1.2/public_html/images/icons/16-square-blue-check.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-square-blue-check.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-square-blue-delete.gif (from rev 992, trunk/1.2/public_html/images/icons/16-square-blue-delete.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-square-blue-delete.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-square-blue-remove.gif (from rev 992, trunk/1.2/public_html/images/icons/16-square-blue-remove.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-square-blue-remove.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-square-blue.gif (from rev 992, trunk/1.2/public_html/images/icons/16-square-blue.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-square-blue.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-square-green-add.gif (from rev 992, trunk/1.2/public_html/images/icons/16-square-green-add.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-square-green-add.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-square-green-check.gif (from rev 992, trunk/1.2/public_html/images/icons/16-square-green-check.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-square-green-check.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-square-green-delete.gif (from rev 992, trunk/1.2/public_html/images/icons/16-square-green-delete.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-square-green-delete.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-square-green-remove.gif (from rev 992, trunk/1.2/public_html/images/icons/16-square-green-remove.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-square-green-remove.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-square-green.gif (from rev 992, trunk/1.2/public_html/images/icons/16-square-green.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-square-green.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-square-red-add.gif (from rev 992, trunk/1.2/public_html/images/icons/16-square-red-add.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-square-red-add.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-square-red-check.gif (from rev 992, trunk/1.2/public_html/images/icons/16-square-red-check.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-square-red-check.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-square-red-delete.gif (from rev 992, trunk/1.2/public_html/images/icons/16-square-red-delete.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-square-red-delete.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-square-red-remove.gif (from rev 992, trunk/1.2/public_html/images/icons/16-square-red-remove.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-square-red-remove.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-square-red.gif (from rev 992, trunk/1.2/public_html/images/icons/16-square-red.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-square-red.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-star-cold.gif (from rev 992, trunk/1.2/public_html/images/icons/16-star-cold.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-star-cold.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-star-hot.gif (from rev 992, trunk/1.2/public_html/images/icons/16-star-hot.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-star-hot.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-tag-add.gif (from rev 992, trunk/1.2/public_html/images/icons/16-tag-add.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-tag-add.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-tag-check.gif (from rev 992, trunk/1.2/public_html/images/icons/16-tag-check.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-tag-check.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-tag-cold.gif (from rev 992, trunk/1.2/public_html/images/icons/16-tag-cold.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-tag-cold.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-tag-cross.gif (from rev 992, trunk/1.2/public_html/images/icons/16-tag-cross.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-tag-cross.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-tag-hot.gif (from rev 992, trunk/1.2/public_html/images/icons/16-tag-hot.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-tag-hot.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-tag-pencil.gif (from rev 992, trunk/1.2/public_html/images/icons/16-tag-pencil.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-tag-pencil.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-tool-a.gif (from rev 992, trunk/1.2/public_html/images/icons/16-tool-a.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-tool-a.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-tool-b.gif (from rev 992, trunk/1.2/public_html/images/icons/16-tool-b.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-tool-b.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-tool-c.gif (from rev 992, trunk/1.2/public_html/images/icons/16-tool-c.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-tool-c.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-tool-d.gif (from rev 992, trunk/1.2/public_html/images/icons/16-tool-d.gif) =================================================================== (Binary files differ) Deleted: releases/1.2/public_html/images/icons/16-tool-d.png =================================================================== (Binary files differ) Copied: releases/1.2/public_html/images/icons/16-zoom.gif (from rev 992, trunk/1.2/public_html/images/icons/16-zoom.gif) =================================================================== (Binary files differ) Dele... [truncated message content] |
From: <cra...@us...> - 2009-10-26 03:16:15
|
Revision: 997 http://cs-project.svn.sourceforge.net/cs-project/?rev=997&view=rev Author: crazedsanity Date: 2009-10-26 03:16:07 +0000 (Mon, 26 Oct 2009) Log Message: ----------- v1.2.0-ALPHA13 part 3. Modified Paths: -------------- releases/1.2/templates/content/helpdesk/view.content.tmpl releases/1.2/templates/content/project/view/index.content.tmpl releases/1.2/templates/content/project/view/related_issue.content.tmpl releases/1.2/templates/content/related_task.shared.tmpl releases/1.2/templates/content/tags/index.content.tmpl releases/1.2/templates/extern/helpdesk/view.content.tmpl releases/1.2/templates/header.shared.tmpl releases/1.2/templates/system/message_box.tmpl releases/1.2/upgrade/upgradeTo1.2.0-ALPHA4.php Added Paths: ----------- releases/1.2/templates/extern/helpdesk/SCRIPT_EXTRA.shared.tmpl Property Changed: ---------------- releases/1.2/rw/ Property changes on: releases/1.2/rw ___________________________________________________________________ Modified: svn:ignore - *.xml + *.xml .config.xml.* config.xml.* Modified: releases/1.2/templates/content/helpdesk/view.content.tmpl =================================================================== --- releases/1.2/templates/content/helpdesk/view.content.tmpl 2009-10-26 03:15:10 UTC (rev 996) +++ releases/1.2/templates/content/helpdesk/view.content.tmpl 2009-10-26 03:16:07 UTC (rev 997) @@ -20,7 +20,7 @@ <td>{public_id} [<b><a href="/extern/helpdesk/view?ID={public_id}">External Link</a></b>] <a href="/help/helpdesk/external_link" target="_blank"> - <img src="/images/icon-help.png" border="0"></a></td> + <img src="/images/icon-help.gif" border="0"></a></td> <td rowspan="4" align="left" nowrap> <!-- BEGIN access_block --> @@ -30,7 +30,7 @@ <td style="border-left:solid #000 1px;border-top:solid #000 1px;">Assigned: <a href="/help/helpdesk/assigned" target="_blank"> - <img src="/images/icon-help.png" border="0"></a> + <img src="/images/icon-help.gif" border="0"></a> </td> <td style="border-right:solid #000 1px;border-top:solid #000 1px;" nowrap> @@ -47,7 +47,7 @@ <tr> <td style="border-left:solid #000 1px;">Priority: <a href="/help/helpdesk/priority" target="_blank"> - <img src="/images/icon-help.png" border="0"></a> + <img src="/images/icon-help.gif" border="0"></a> </td> <td style="border-right:solid #000 1px"> @@ -65,7 +65,7 @@ Attached to project: <a href="/help/helpdesk/project_linkage" target="_blank"> - <img src="/images/icon-help.png" border="0"></a> + <img src="/images/icon-help.gif" border="0"></a> <br>[ <b>{ancestryLinkList}</b> ] </td> @@ -97,7 +97,7 @@ <tr> <th colspan="2" style="background-color:#FFF"> Notified Users <a href="/help/helpdesk/notified_users" target="_blank"> - <img src="/images/icon-help.png" border="0"></a> + <img src="/images/icon-help.gif" border="0"></a> </th> </tr> <tr> @@ -149,7 +149,7 @@ <tr> <th align="right">Tags: <a href="/help/tag" target="_blank"> - <img src="/images/icon-help.png" border="0"></a> + <img src="/images/icon-help.gif" border="0"></a> </th> <td colspan="2"> @@ -226,7 +226,7 @@ <a href="/help/helpdesk/submit_buttons" target="_blank"> - <img src="/images/icon-help.png" border="0"></a> + <img src="/images/icon-help.gif" border="0"></a> <BR> Is this a <b>Solution</b>? Modified: releases/1.2/templates/content/project/view/index.content.tmpl =================================================================== --- releases/1.2/templates/content/project/view/index.content.tmpl 2009-10-26 03:15:10 UTC (rev 996) +++ releases/1.2/templates/content/project/view/index.content.tmpl 2009-10-26 03:16:07 UTC (rev 997) @@ -118,12 +118,12 @@ </td> </tr> <tr> - <td width="50%"> + <td width="50%" valign="top"> <div id="related_task" width="100%">{related_task}</div> <div id="related_note" style="padding-top:1em;">{related_note}</div> </td> - <td width="50%"> + <td width="50%" valign="top"> <div id="related_issue">{related_issue}</div> </td> </tr> Modified: releases/1.2/templates/content/project/view/related_issue.content.tmpl =================================================================== --- releases/1.2/templates/content/project/view/related_issue.content.tmpl 2009-10-26 03:15:10 UTC (rev 996) +++ releases/1.2/templates/content/project/view/related_issue.content.tmpl 2009-10-26 03:16:07 UTC (rev 997) @@ -2,7 +2,7 @@ <tr> <td colspan="6"><b>Related Helpdesk Issues</b> (<a href="/content/helpdesk/create?proj={public_id}&goBack=1">Create</a>): <!-- BEGIN helpdeskPrefWarning --> - <BR><font color="red"><b>Warning:</b></font> Not all preferences will be displayed, due to your <a href="/content/settings">Preferences</a>. + <BR><font color="red"><b>Warning:</b></font> Not all issues will be displayed, due to your <a href="/content/settings">Preferences</a>. <!-- END helpdeskPrefWarning --> <hr></td> </tr> Modified: releases/1.2/templates/content/related_task.shared.tmpl =================================================================== --- releases/1.2/templates/content/related_task.shared.tmpl 2009-10-26 03:15:10 UTC (rev 996) +++ releases/1.2/templates/content/related_task.shared.tmpl 2009-10-26 03:16:07 UTC (rev 997) @@ -4,7 +4,7 @@ <b>Related Tasks: </b> (<a href='/content/task/create?parentPublicId={public_id}&module={module}' target=_top>Create</a>): <a href="/help/task" target="_blank"> - <img src="/images/icon-help.png" border="0"></a> + <img src="/images/icon-help.gif" border="0"></a> <!-- BEGIN taskPrefWarning --> <BR><font color="red"><b>Warning:</b></font> Not all issues will be displayed, due to your <a href="/content/settings">preferences</a>. <!-- END taskPrefWarning --> @@ -36,4 +36,4 @@ </tr> <!-- END related_task_row --> -</table> \ No newline at end of file +</table> Modified: releases/1.2/templates/content/tags/index.content.tmpl =================================================================== --- releases/1.2/templates/content/tags/index.content.tmpl 2009-10-26 03:15:10 UTC (rev 996) +++ releases/1.2/templates/content/tags/index.content.tmpl 2009-10-26 03:16:07 UTC (rev 997) @@ -10,7 +10,7 @@ <td> <!-- BEGIN availableTagsList --> <div id="listedTag_%%tagNameId%%" style="padding-left:5px;"> - <img src="/images/bullet-round.png" border="0"> + <img src="/images/bullet-round.gif" border="0"> <a href="javascript:void(xajax_ajax__showtagrecords(%%tagNameId%%));"> %%tagName%%</a> <!-- BEGIN availableTagsList__tagIcon --> <img src="/images/tags/%%icon_name%%.gif" border="0"> @@ -19,7 +19,7 @@ <!-- END availableTagsList --> <!-- BEGIN availableTagsList_noLink --> <div id="noListedTags" style="padding-left:5px;"> - <img src="/images/bullet-round.png" border="0"> + <img src="/images/bullet-round.gif" border="0"> <font size="+1"><b>%%tagName%%</b></font> {availableTagsList__tagIcon} </div> @@ -60,7 +60,7 @@ </tr> <tr> <td><b>Modifier:</b> - <a href="/help/tag/modifier" target="_blank"><img src="/images/icon-help.png" border="0"></a></td> + <a href="/help/tag/modifier" target="_blank"><img src="/images/icon-help.gif" border="0"></a></td> <td> <select name="modifier" onChange="this.form.submit();"> {modifier_option_list} Copied: releases/1.2/templates/extern/helpdesk/SCRIPT_EXTRA.shared.tmpl (from rev 992, trunk/1.2/templates/extern/helpdesk/SCRIPT_EXTRA.shared.tmpl) =================================================================== --- releases/1.2/templates/extern/helpdesk/SCRIPT_EXTRA.shared.tmpl (rev 0) +++ releases/1.2/templates/extern/helpdesk/SCRIPT_EXTRA.shared.tmpl 2009-10-26 03:16:07 UTC (rev 997) @@ -0,0 +1,5 @@ +<script type= "text/javascript"> +var RecaptchaOptions = { +theme: 'clean' +}; +</script> \ No newline at end of file Modified: releases/1.2/templates/extern/helpdesk/view.content.tmpl =================================================================== --- releases/1.2/templates/extern/helpdesk/view.content.tmpl 2009-10-26 03:15:10 UTC (rev 996) +++ releases/1.2/templates/extern/helpdesk/view.content.tmpl 2009-10-26 03:16:07 UTC (rev 997) @@ -63,14 +63,14 @@ <td></td> <td colspan="2">Remark: <br> - <textarea name="remark" rows="8" cols="80"></textarea> + <textarea name="remark" rows="8" cols="80">{POST_remark}</textarea> </td> </tr> <tr> <td></td> - <td colspan="2"> - <input name="action" value="Remark" type="submit"> + <td colspan="2">{captcha} + <input name="action" value="Remark" type="submit"> </td> </tr> Modified: releases/1.2/templates/header.shared.tmpl =================================================================== --- releases/1.2/templates/header.shared.tmpl 2009-10-26 03:15:10 UTC (rev 996) +++ releases/1.2/templates/header.shared.tmpl 2009-10-26 03:16:07 UTC (rev 997) @@ -3,6 +3,7 @@ <title>{html_title}</title> <link rel=stylesheet type='text/css' href='/css/common.css'> {XAJAX_HEADERS} + {SCRIPT_EXTRA} <script language="javascript" src="/js/prototype.js" type="text/javascript"></script> <script language="javascript" src="/js/scriptaculous.js" type="text/javascript"></script> <script language="javascript" src="/js/cs-project.js" type="text/javascript"></script> Modified: releases/1.2/templates/system/message_box.tmpl =================================================================== --- releases/1.2/templates/system/message_box.tmpl 2009-10-26 03:15:10 UTC (rev 996) +++ releases/1.2/templates/system/message_box.tmpl 2009-10-26 03:16:07 UTC (rev 997) @@ -11,7 +11,7 @@ <tr> <td valign="top"> <p style="border-style: solid; border-width: 0px 0px 2px 0px" class="title1"> - <img src="/images/message_icons/{messageType}.png" border="0"> {title} + <img src="/images/message_icons/{messageType}.gif" border="0"> {title} </p> <p style="margin: 5px 0px 5px 0px">{message}</p> {redirect} </td> Modified: releases/1.2/upgrade/upgradeTo1.2.0-ALPHA4.php =================================================================== --- releases/1.2/upgrade/upgradeTo1.2.0-ALPHA4.php 2009-10-26 03:15:10 UTC (rev 996) +++ releases/1.2/upgrade/upgradeTo1.2.0-ALPHA4.php 2009-10-26 03:16:07 UTC (rev 997) @@ -104,11 +104,11 @@ //========================================================================= public function update_config_file() { - $fs = new cs_fileSystemClass(dirname(__FILE__) .'/../'); - $sampleXmlObj = new XMLParser($fs->read('docs/samples/sample_config.xml')); - $siteXmlObj = new XMLParser($fs->read(CONFIG_FILE_LOCATION)); + $fs = new cs_fileSystem(dirname(__FILE__) .'/../'); + $sampleXmlObj = new cs_phpxmlParser($fs->read('docs/samples/sample_config.xml')); + $siteXmlObj = new cs_phpxmlParser($fs->read(CONFIG_FILE_LOCATION)); - $updateXml = new xmlCreator(); + $updateXml = new cs_phpxmlCreator(); $updateXml->load_xmlparser_data($siteXmlObj); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cra...@us...> - 2009-10-26 03:15:22
|
Revision: 996 http://cs-project.svn.sourceforge.net/cs-project/?rev=996&view=rev Author: crazedsanity Date: 2009-10-26 03:15:10 +0000 (Mon, 26 Oct 2009) Log Message: ----------- v1.2.0-ALPHA13 part 2. Modified Paths: -------------- releases/1.2/lib/_unitTests_/cs-content_tests.php releases/1.2/lib/abstractClasses/dbAbstract.class.php releases/1.2/lib/bbCodeParser.class.php releases/1.2/lib/config.class.php releases/1.2/lib/cs-content/VERSION releases/1.2/lib/cs-content/abstract/cs_content.abstract.class.php releases/1.2/lib/cs-content/contentSystem.class.php releases/1.2/lib/cs-content/cs_fileSystem.class.php releases/1.2/lib/cs-content/cs_genericPage.class.php releases/1.2/lib/cs-content/cs_globalFunctions.class.php releases/1.2/lib/cs-content/cs_session.class.php releases/1.2/lib/cs-content/sample_files/public_html/content releases/1.2/lib/cs-content/sample_files/templates/system/404.shared.tmpl releases/1.2/lib/cs-content/sample_files/templates/system/message_box.tmpl releases/1.2/lib/cs-content/tests/files/gptest_all-together.txt releases/1.2/lib/cs-content/tests/files/templates/content.shared.tmpl releases/1.2/lib/cs-content/tests/files/templates/footer.shared.tmpl releases/1.2/lib/cs-content/tests/files/templates/infobar.shared.tmpl releases/1.2/lib/cs-content/tests/files/templates/main.shared.tmpl releases/1.2/lib/cs-content/tests/files/templates/menubar.shared.tmpl releases/1.2/lib/cs-content/tests/files/templates/title.shared.tmpl releases/1.2/lib/cs-content/tests/testOfCSContent.php releases/1.2/lib/cs-phpxml/README.txt releases/1.2/lib/cs-phpxml/VERSION releases/1.2/lib/cs-phpxml/cs_phpxml.abstract.class.php releases/1.2/lib/cs-phpxml/cs_phpxmlBuilder.class.php releases/1.2/lib/cs-phpxml/cs_phpxmlCreator.class.php releases/1.2/lib/cs-phpxml/cs_phpxmlParser.class.php releases/1.2/lib/cs-phpxml/tests/example_test.php releases/1.2/lib/cs-phpxml/tests/testOfCSPHPXML.php releases/1.2/lib/globalFunctions.php releases/1.2/lib/helpdeskClass.php releases/1.2/lib/mainRecordClass.php releases/1.2/lib/session_class.php releases/1.2/lib/site_config.php Added Paths: ----------- releases/1.2/lib/_setup/ releases/1.2/lib/_setup/MyDisplay.class.php releases/1.2/lib/_setup/__finalStep.class.php releases/1.2/lib/_setup/__setupDefaultValues.class.php releases/1.2/lib/_setup/__tmpSetupClass.class.php releases/1.2/lib/_setup/_setupUpgrade.class.php releases/1.2/lib/_setup/unitTest.class.php releases/1.2/lib/cs-content/__autoload.php releases/1.2/lib/cs-content/abstract/cs_version.abstract.class.php releases/1.2/lib/cs-content/sample_files/public_html/images/ releases/1.2/lib/cs-content/sample_files/public_html/images/clear.gif releases/1.2/lib/cs-content/sample_files/public_html/images/frame/ releases/1.2/lib/cs-content/sample_files/public_html/images/frame/crn-white-bl.gif releases/1.2/lib/cs-content/sample_files/public_html/images/frame/crn-white-br.gif releases/1.2/lib/cs-content/sample_files/public_html/images/frame/crn-white-tl.gif releases/1.2/lib/cs-content/sample_files/public_html/images/frame/crn-white-tr.gif releases/1.2/lib/cs-content/tests/files/gptest_blockrows.txt releases/1.2/lib/cs-content/tests/files/gptest_blockrows2.txt releases/1.2/lib/cs-content/tests/files/includes/ releases/1.2/lib/cs-content/tests/files/includes/shared.inc releases/1.2/lib/cs-content/tests/files/templates/system/ releases/1.2/lib/cs-content/tests/files/templates/system/404.shared.tmpl releases/1.2/lib/cs-content/tests/files/templates/system/message_box.tmpl releases/1.2/lib/cs-content/tests/files/version1 releases/1.2/lib/cs-content/tests/files/version2 releases/1.2/lib/cs-content/tests/files/version3 releases/1.2/lib/cs-content/tests/testOfCSFileSystem.php releases/1.2/lib/cs-content/tests/testOfCSGlobalFunctions.php releases/1.2/lib/cs-content/tests/testOfCSVersionAbstract.php releases/1.2/lib/cs-content.tmp releases/1.2/lib/cs-phpxml/cs_arrayToPath.class.php releases/1.2/lib/cs-phpxml/tests/files/test2-issue267.xml releases/1.2/lib/cs-phpxml/tests/testOfA2P.php releases/1.2/lib/cs-webapplibs/ releases/1.2/lib/cs-webapplibs/VERSION releases/1.2/lib/cs-webapplibs/abstract/ releases/1.2/lib/cs-webapplibs/abstract/cs_phpDB.abstract.class.php releases/1.2/lib/cs-webapplibs/abstract/cs_webapplibs.abstract.class.php releases/1.2/lib/cs-webapplibs/cs_authToken.class.php releases/1.2/lib/cs-webapplibs/cs_bbCodeParser.class.php releases/1.2/lib/cs-webapplibs/cs_phpDB.class.php releases/1.2/lib/cs-webapplibs/cs_sessionDB.class.php releases/1.2/lib/cs-webapplibs/cs_siteConfig.class.php releases/1.2/lib/cs-webapplibs/cs_tabs.class.php releases/1.2/lib/cs-webapplibs/cs_webdblogger.class.php releases/1.2/lib/cs-webapplibs/cs_webdbupgrade.class.php releases/1.2/lib/cs-webapplibs/db_types/ releases/1.2/lib/cs-webapplibs/db_types/cs_phpDB__mysql.class.php releases/1.2/lib/cs-webapplibs/db_types/cs_phpDB__pgsql.class.php releases/1.2/lib/cs-webapplibs/db_types/cs_phpDB__sqlite.class.php releases/1.2/lib/cs-webapplibs/docs/ releases/1.2/lib/cs-webapplibs/docs/CREDITS releases/1.2/lib/cs-webapplibs/docs/LICENSE releases/1.2/lib/cs-webapplibs/docs/README.txt releases/1.2/lib/cs-webapplibs/docs/SETUP.txt releases/1.2/lib/cs-webapplibs/setup/ releases/1.2/lib/cs-webapplibs/setup/schema.mysql.sql releases/1.2/lib/cs-webapplibs/setup/schema.pgsql.sql releases/1.2/lib/cs-webapplibs/tests/ releases/1.2/lib/cs-webapplibs/tests/example_test.php releases/1.2/lib/cs-webapplibs/tests/files/ releases/1.2/lib/cs-webapplibs/tests/testOfCSPHPDB.php releases/1.2/lib/cs-webapplibs/tests/testOfCSWebAppLibs.php releases/1.2/lib/cs-webapplibs/upgrades/ releases/1.2/lib/cs-webapplibs/upgrades/upgrade.xml releases/1.2/lib/recaptchalib.php Removed Paths: ------------- releases/1.2/lib/_setup/MyDisplay.class.php releases/1.2/lib/_setup/__finalStep.class.php releases/1.2/lib/_setup/__setupDefaultValues.class.php releases/1.2/lib/_setup/__tmpSetupClass.class.php releases/1.2/lib/_setup/_setupUpgrade.class.php releases/1.2/lib/_setup/unitTest.class.php releases/1.2/lib/_unitTests_/cs-arrayToPath_tests.php releases/1.2/lib/_unitTests_/cs-phpxml_tests.php releases/1.2/lib/cs-arrayToPath/ releases/1.2/lib/cs-versionparse/ releases/1.2/lib/upgradeClass.php Deleted: releases/1.2/lib/_setup/MyDisplay.class.php =================================================================== --- trunk/1.2/lib/_setup/MyDisplay.class.php 2009-10-25 18:37:02 UTC (rev 992) +++ releases/1.2/lib/_setup/MyDisplay.class.php 2009-10-26 03:15:10 UTC (rev 996) @@ -1,46 +0,0 @@ -<?php -/* - * Created on Aug 23, 2007 - * - * SVN INFORMATION::: - * ------------------- - * Last Author::::::::: $Author$ - * Current Revision:::: $Revision$ - * Repository Location: $HeadURL$ - * Last Updated:::::::: $Date$ - */ - - - - -//####################################################################################### -/** - * Built to avoid always printing-out the results (so we can retrieve result data separately. - */ -class MyDisplay extends SimpleReporter { - - function paintHeader($test_name) { - } - - function paintFooter($test_name) { - } - - function paintStart($test_name, $size) { - parent::paintStart($test_name, $size); - } - - function paintEnd($test_name, $size) { - parent::paintEnd($test_name, $size); - } - - function paintPass($message) { - parent::paintPass($message); - } - - function paintFail($message) { - parent::paintFail($message); - } -} -//####################################################################################### - -?> Copied: releases/1.2/lib/_setup/MyDisplay.class.php (from rev 992, trunk/1.2/lib/_setup/MyDisplay.class.php) =================================================================== --- releases/1.2/lib/_setup/MyDisplay.class.php (rev 0) +++ releases/1.2/lib/_setup/MyDisplay.class.php 2009-10-26 03:15:10 UTC (rev 996) @@ -0,0 +1,46 @@ +<?php +/* + * Created on Aug 23, 2007 + * + * SVN INFORMATION::: + * ------------------- + * Last Author::::::::: $Author$ + * Current Revision:::: $Revision$ + * Repository Location: $HeadURL$ + * Last Updated:::::::: $Date$ + */ + + + + +//####################################################################################### +/** + * Built to avoid always printing-out the results (so we can retrieve result data separately. + */ +class MyDisplay extends SimpleReporter { + + function paintHeader($test_name) { + } + + function paintFooter($test_name) { + } + + function paintStart($test_name, $size) { + parent::paintStart($test_name, $size); + } + + function paintEnd($test_name, $size) { + parent::paintEnd($test_name, $size); + } + + function paintPass($message) { + parent::paintPass($message); + } + + function paintFail($message) { + parent::paintFail($message); + } +} +//####################################################################################### + +?> Deleted: releases/1.2/lib/_setup/__finalStep.class.php =================================================================== --- trunk/1.2/lib/_setup/__finalStep.class.php 2009-10-25 18:37:02 UTC (rev 992) +++ releases/1.2/lib/_setup/__finalStep.class.php 2009-10-26 03:15:10 UTC (rev 996) @@ -1,142 +0,0 @@ -<?php -/* - * Created on Aug 23, 2007 - * - * SVN INFORMATION::: - * ------------------- - * Last Author::::::::: $Author$ - * Current Revision:::: $Revision$ - * Repository Location: $HeadURL$ - * Last Updated:::::::: $Date$ - */ - - - -class __finalStep { - - - private $page; - private $gfObj; - - - //========================================================================= - public function __construct(cs_genericPage $page, array $stepData) { - $this->page = $page; - $this->stepData = $stepData; - unset($this->stepData[5]); - - $this->gfObj = new cs_globalFunctions; - $this->fsObj = new cs_fileSystem(dirname(__FILE__) ."/../../". CONFIG_DIRECTORY); - }//end __construct() - //========================================================================= - - - - //========================================================================= - function write_config() { - if($this->fsObj->is_writable(NULL)) { - $lsData = $this->fsObj->ls(); - if(!is_array($lsData[CONFIG_FILENAME])) { - $myData = array(); - foreach($this->stepData as $stepNum=>$garbage) { - $tempStepData = get_setup_data($stepNum, 'data'); - if(is_array($tempStepData)) { - $myData = array_merge($tempStepData, $myData); - } - else { - throw new exception(__METHOD__ .": step #". $stepNum ." has no valid data... ". $this->gfObj->debug_print($tempStepData,0)); - } - } - - //now that we've built the array successfully, now let's turn it into XML. - $xmlCreator = new cs_phpxmlCreator('config'); - $tagPath = "/config/main"; - $xmlCreator->add_tag($tagPath); - $xmlCreator->add_attribute($tagPath, array('fix'=>"sanitizeDirs")); - $xmlCreator->set_tag_as_multiple($tagPath); - - //Special values (including vars that cs_siteConfig{} handles) - $specialValues = array( - 'site_root' => '{_DIRNAMEOFFILE_}/..', - 'document_root' => '{MAIN/SITE_ROOT}', - 'libdir' => '{MAIN/SITE_ROOT}/lib', - 'tmpldir' => '{MAIN/SITE_ROOT}/templates', - 'seq_helpdesk' => 'special__helpdesk_public_id_seq', - 'seq_project' => 'special__project_public_id_seq', - 'seq_main' => 'record_table_record_id_seq', - 'table_todocomment' => 'task_comment_table', - 'rwdir' => '{MAIN/SITE_ROOT}/rw', - 'format_wordwrap' => '90' - ); - $defineAsGlobal=array('site_root', 'libdir', 'tmpldir'); - foreach($specialValues as $index=>$value) { - $xmlCreator->add_tag($tagPath .'/'. $index, $value); - $attributes = array('setconstant'=>1); - if(array_search($index, $defineAsGlobal)) { - $attributes['setglobal']=1; - } - $xmlCreator->add_attribute($tagPath .'/'. $index, $attributes); - } - - $skipSetConstant = array('version_string', 'workingonit'); - foreach($myData as $index=>$value) { - $xmlCreator->add_tag($tagPath ."/". $index, $value); - $attributes=array(); - if(!strlen(array_search($index, $skipSetConstant))) { - $attributes['setconstant']=1; - } - $xmlCreator->add_attribute($tagPath .'/'. $index, $attributes); - } - $extraAttributes = array( - 'generated' => date('Y-m-d H:m:s'), - 'version' => $myData['version_string'], - 'usecssiteconfig' => 1 - ); - $xmlCreator->add_attribute('/config', $extraAttributes); - - //add values for other libs... - $tagPath = '/config/cs-webapplibs'; - $xmlCreator->add_tag($tagPath); - $attributes = array('setconstant'=>1, 'setconstantprefix'=>"cs_webapplibs"); - - //TODO: set this dynamically if other databases are supported. - $xmlCreator->add_tag($tagPath .'/DBTYPE', 'pgsql', array('setconstant'=>1)); - $xmlCreator->add_tag($tagPath .'/DB_CONNECT_HOST', '{MAIN/DATABASE__HOST}', $attributes); - $xmlCreator->add_tag($tagPath .'/DB_CONNECT_DBNAME', '{MAIN/DATABASE__DBNAME}', $attributes); - $xmlCreator->add_tag($tagPath .'/DB_CONNECT_USER', '{MAIN/DATABASE__USER}', $attributes); - $xmlCreator->add_tag($tagPath .'/DB_CONNECT_PASSWORD', '{MAIN/DATABASE__PASSWORD}', $attributes); - $xmlCreator->add_tag($tagPath .'/DB_CONNECT_PORT', '{MAIN/DATABASE__PORT}', $attributes); - - //now, create an XML string... - $xmlString = $xmlCreator->create_xml_string(); - - $this->fsObj->create_file(CONFIG_FILENAME, TRUE); - $writeRes = $this->fsObj->write($xmlString, CONFIG_FILENAME); - - if($writeRes > 0) { - $retval = "Successfully created the XML config file"; - store_setup_data(5, 1, 'result'); - store_setup_data(5, $retval, 'text'); - } - else { - throw new exception(__METHOD__ .": failed to write any data to the config file"); - } - } - else { - throw new exception(__METHOD__ .": ". CONFIG_FILE_LOCATION ." already exists!"); - } - } - else { - throw new exception(__METHOD__ .": the config directory is not writable!"); - } - - $configObj = new config(CONFIG_FILE_LOCATION); - $configObj->remove_setup_config(); - - return($retval); - }//end write_config() - //========================================================================= -} - - -?> Copied: releases/1.2/lib/_setup/__finalStep.class.php (from rev 992, trunk/1.2/lib/_setup/__finalStep.class.php) =================================================================== --- releases/1.2/lib/_setup/__finalStep.class.php (rev 0) +++ releases/1.2/lib/_setup/__finalStep.class.php 2009-10-26 03:15:10 UTC (rev 996) @@ -0,0 +1,144 @@ +<?php +/* + * Created on Aug 23, 2007 + * + * SVN INFORMATION::: + * ------------------- + * Last Author::::::::: $Author$ + * Current Revision:::: $Revision$ + * Repository Location: $HeadURL$ + * Last Updated:::::::: $Date$ + */ + + + +class __finalStep { + + + private $page; + private $gfObj; + + + //========================================================================= + public function __construct(cs_genericPage $page, array $stepData) { + $this->page = $page; + $this->stepData = $stepData; + unset($this->stepData[5]); + + $this->gfObj = new cs_globalFunctions; + $this->fsObj = new cs_fileSystem(dirname(__FILE__) ."/../../". CONFIG_DIRECTORY); + }//end __construct() + //========================================================================= + + + + //========================================================================= + function write_config() { + if($this->fsObj->is_writable(NULL)) { + $lsData = $this->fsObj->ls(); + if(!is_array($lsData[CONFIG_FILENAME])) { + $myData = array(); + foreach($this->stepData as $stepNum=>$garbage) { + $tempStepData = get_setup_data($stepNum, 'data'); + if(is_array($tempStepData)) { + $myData = array_merge($tempStepData, $myData); + } + else { + throw new exception(__METHOD__ .": step #". $stepNum ." has no valid data... ". $this->gfObj->debug_print($tempStepData,0)); + } + } + + //now that we've built the array successfully, now let's turn it into XML. + $xmlCreator = new cs_phpxmlCreator('config'); + $tagPath = "/config/main"; + $xmlCreator->add_tag($tagPath); + $xmlCreator->add_attribute($tagPath, array('fix'=>"sanitizeDirs")); + $xmlCreator->set_tag_as_multiple($tagPath); + + //Special values (including vars that cs_siteConfig{} handles) + $specialValues = array( + 'site_root' => '{_DIRNAMEOFFILE_}/..', + 'document_root' => '{MAIN/SITE_ROOT}', + 'libdir' => '{MAIN/SITE_ROOT}/lib', + 'tmpldir' => '{MAIN/SITE_ROOT}/templates', + 'seq_helpdesk' => 'special__helpdesk_public_id_seq', + 'seq_project' => 'special__project_public_id_seq', + 'seq_main' => 'record_table_record_id_seq', + 'table_todocomment' => 'task_comment_table', + 'rwdir' => '{MAIN/SITE_ROOT}/rw', + 'format_wordwrap' => '90', + 'recaptcha_publickey' => '6Ld27ggAAAAAADHN-jYSdY0cJjfM10pjRgbWS02B', + 'recaptcha_privatekey' => '6Ld27ggAAAAAAErK12LU6sCeYF8m-whCJn4azM2B' + ); + $defineAsGlobal=array('site_root', 'libdir', 'tmpldir'); + foreach($specialValues as $index=>$value) { + $xmlCreator->add_tag($tagPath .'/'. $index, $value); + $attributes = array('setconstant'=>1); + if(array_search($index, $defineAsGlobal)) { + $attributes['setglobal']=1; + } + $xmlCreator->add_attribute($tagPath .'/'. $index, $attributes); + } + + $skipSetConstant = array('version_string', 'workingonit'); + foreach($myData as $index=>$value) { + $xmlCreator->add_tag($tagPath ."/". $index, $value); + $attributes=array(); + if(!strlen(array_search($index, $skipSetConstant))) { + $attributes['setconstant']=1; + } + $xmlCreator->add_attribute($tagPath .'/'. $index, $attributes); + } + $extraAttributes = array( + 'generated' => date('Y-m-d H:m:s'), + 'version' => $myData['version_string'], + 'usecssiteconfig' => 1 + ); + $xmlCreator->add_attribute('/config', $extraAttributes); + + //add values for other libs... + $tagPath = '/config/cs-webapplibs'; + $xmlCreator->add_tag($tagPath); + $attributes = array('setconstant'=>1, 'setconstantprefix'=>"cs_webapplibs"); + + //TODO: set this dynamically if other databases are supported. + $xmlCreator->add_tag($tagPath .'/DBTYPE', 'pgsql', array('setconstant'=>1)); + $xmlCreator->add_tag($tagPath .'/DB_CONNECT_HOST', '{MAIN/DATABASE__HOST}', $attributes); + $xmlCreator->add_tag($tagPath .'/DB_CONNECT_DBNAME', '{MAIN/DATABASE__DBNAME}', $attributes); + $xmlCreator->add_tag($tagPath .'/DB_CONNECT_USER', '{MAIN/DATABASE__USER}', $attributes); + $xmlCreator->add_tag($tagPath .'/DB_CONNECT_PASSWORD', '{MAIN/DATABASE__PASSWORD}', $attributes); + $xmlCreator->add_tag($tagPath .'/DB_CONNECT_PORT', '{MAIN/DATABASE__PORT}', $attributes); + + //now, create an XML string... + $xmlString = $xmlCreator->create_xml_string(); + + $this->fsObj->create_file(CONFIG_FILENAME, TRUE); + $writeRes = $this->fsObj->write($xmlString, CONFIG_FILENAME); + + if($writeRes > 0) { + $retval = "Successfully created the XML config file"; + store_setup_data(5, 1, 'result'); + store_setup_data(5, $retval, 'text'); + } + else { + throw new exception(__METHOD__ .": failed to write any data to the config file"); + } + } + else { + throw new exception(__METHOD__ .": ". CONFIG_FILE_LOCATION ." already exists!"); + } + } + else { + throw new exception(__METHOD__ .": the config directory is not writable!"); + } + + $configObj = new config(CONFIG_FILE_LOCATION); + $configObj->remove_setup_config(); + + return($retval); + }//end write_config() + //========================================================================= +} + + +?> Deleted: releases/1.2/lib/_setup/__setupDefaultValues.class.php =================================================================== --- trunk/1.2/lib/_setup/__setupDefaultValues.class.php 2009-10-25 18:37:02 UTC (rev 992) +++ releases/1.2/lib/_setup/__setupDefaultValues.class.php 2009-10-26 03:15:10 UTC (rev 996) @@ -1,974 +0,0 @@ -<?php -/* - * Created on Aug 23, 2007 - * - * SVN INFORMATION::: - * ------------------- - * Last Author::::::::: $Author$ - * Current Revision:::: $Revision$ - * Repository Location: $HeadURL$ - * Last Updated:::::::: $Date$ - */ - -class __setupDefaultValues extends cs_webdbupgrade { - - - protected $db; - private $totalRecords=0; - - private $data=array(); - - private $lastNumrows=NULL; - private $lastDberror=NULL; - - //========================================================================= - public function __construct() { - $this->db = new cs_phpDB; - $this->gfObj = new cs_globalFunctions; - }//end __construct() - //========================================================================= - - - - //========================================================================= - public function go() { - store_setup_data(3, 0, 'result'); - try { - $params = get_db_params(); - $this->db->connect($params); - $this->db->beginTrans(__METHOD__); - $retval = "Connected successfully to the database."; - - //now that we've connected, start doing stuff. - $retval = $this->set_version(); - $retval .= "<BR>\n". $this->create_log_categories_and_classes(); - $retval .= "<BR>\n". $this->create_attributes(); - $retval .= "<BR>\n". $this->create_anonymous_contact_data(); - $retval .= "<BR>\n". $this->create_status_records(); - $retval .= "<BR>\n". $this->create_tag_names(); - $retval .= "<BR>\n". $this->build_preferences(); - $retval .= "<BR>\n". $this->create_users(); - $retval .= "<BR>\n". $this->create_user_group_records(); - - $commitRes = $this->db->commitTrans(); - if($commitRes == 1) { - $retval .= "<BR>\n ----------- Created (". $this->totalRecords ."), result of commit: (". $commitRes .")."; - store_setup_data(3, 1, 'result'); - store_setup_data(4, 1, 'accessible'); - } - else { - $this->db->rollbackTrans(); - store_setup_data(3, 0, 'result'); - throw new exception(__METHOD__ .": failed to commit the transaction (". $commitRes .")"); - } - - } - catch(exception $e) { - //TODO: rollback the transaction - $retval = "An error occurred: ". $e->getMessage(); - } - - return($retval); - - }//end go() - //========================================================================= - - - - //========================================================================= - /** - * Set version information into the database for future upgradeability. - */ - private function set_version() { - //get the version string. - $fullVersionString = read_version_file(); - - $suffixData = explode('-', $fullVersionString); - if(count($suffixData) == 2 && preg_match('/\./', $suffixData[0]) && !preg_match('/\./', $suffixData[1])) { - //there's a suffix, and it doesn't contain periods (i.e. "1.0.0-ALPHA1") - $suffix = $suffixData[1]; - } - elseif(count($suffixData) == 1) { - //no suffix. - $suffix = ""; - } - else { - //there's a dash in the name, but it's invalid or contains periods (i.e. "BETA-1.0.0" or "1.0.0-ALPHA1.0") - throw new exception(__METHOD__ .": version string is invalid (". $fullVersionString ."), suffix contains dashes, or there is a prefix"); - } - - //remove the suffix & parse it. - $versionString = $suffixData[0]; - $versionData = $this->parse_version_string($fullVersionString); - $sqlData = $versionData; - - - #$sqlData = array( - # 'version_string' => $fullVersionString, - # 'version_major' => $versionData[0], - # 'version_minor' => $versionData[1], - # 'version_maintenance' => $versionData[2], - # 'version_suffix' => $suffix - #); - - $retval = 0; - foreach($sqlData as $name => $value) { - $sql = "SELECT internal_data_set_value('". $name ."', '". $value ."')"; - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - $retval++; - $this->totalRecords++; - } - else { - throw new exception(__METHOD__ .": failed to set (". $name .") as (". $value .")::: ". $dberror); - } - } - - if($retval == count($sqlData)) { - //okay, the final test: run a query that straps everything together, to ensure it all has the same version. - $sql = "SELECT internal_data_get_value('version_major') || '.' || internal_data_get_value('version_minor') " . - " || '.' || internal_data_get_value('version_maintenance') as text, " . - "internal_data_get_value('version_suffix') as version_suffix;"; - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - $data = $this->db->farray(); - $dbVersionString = $data['text']; - if(strlen($data['version_suffix'])) { - $dbVersionString .= "-". $data['version_suffix']; - } - - if($dbVersionString === $fullVersionString) { - //okay, one final test: check that the "version_string" in the database matches ours. - $sql = "SELECT internal_data_get_value('version_string')"; - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - $data = $this->db->farray(); - $dbVersionString = $data[0]; - - if($dbVersionString === $fullVersionString) { - $this->data['version_string'] = $fullVersionString; - $retval = "Successfully set version string"; - } - else { - throw new exception(__METHOD__ .": derived database version string (". $dbVersionString .") doesn't match our version (". $fullVersionString .")"); - } - } - else { - throw new exception(__METHOD__ .": failed to retrieve full version_string from database::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - else { - throw new exception(__METHOD__ .": derived database version string (". $dbVersionString .") doesn't match our version (". $fullVersionString .")"); - } - } - else { - throw new exception(__METHOD__ .": failed to retrieve derived database version string::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - else { - //it's cryptic, but what should it really say??? - throw new exception(__METHOD__ .": internal error, checksum didn't match"); - } - - return($retval); - - }//end set_version() - //========================================================================= - - - - //========================================================================= - private function create_log_categories_and_classes() { - - $counter = 0; - - $classes = array( - 1 => 'Error', - 2 => 'Information', - 3 => 'Create', - 4 => 'Update', - 5 => 'Delete', - 6 => 'REPORT', - 7 => 'DEBUG' - ); - - - foreach($classes as $num=>$name) { - $insertArr = array( - 'log_class_id' => $num, - 'name' => $name - ); - $sql = "INSERT INTO log_class_table ". $this->gfObj->string_from_array($insertArr, 'insert', NULL, 'sql'); - - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - //good. - $counter++; - $this->totalRecords++; - } - else { - throw new exception(__METHOD__ .": failed to create class record for (". $name .")::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - - - //Reset sequence, so new records can be created. - $sql = "SELECT setval('log_class_table_log_class_id_seq', (SELECT max(log_class_id) FROM log_class_table))"; - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - $categories = array( - 1 => 'Database', - 2 => 'Authentication', - 3 => 'Users', - 4 => 'General', - 5 => 'Project', - 6 => 'Helpdesk', - 7 => 'Task', - 8 => 'Tags', - 9 => 'Estimates', - 10 => 'Navigation', - 11 => 'Preferences' - ); - - - foreach($categories as $num=>$name) { - $insertArr = array( - 'log_category_id' => $num, - 'name' => $name - ); - $sql = "INSERT INTO log_category_table ". $this->gfObj->string_from_array($insertArr, 'insert', NULL, 'sql'); - - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - //good. - $counter++; - $this->totalRecords++; - } - else { - throw new exception(__METHOD__ .": failed to create category record for (". $name .")::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - - //Reset sequence, so new records can be created. - $sql = "SELECT setval('log_category_table_log_category_id_seq', (SELECT max(log_category_id) FROM log_category_table))"; - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - - //format (primary index is log_event_id): log_class_id, log_category_id, description - $logEvents = array( - // * log_event_id | log_class_id | log_category_id | description - 1 => array(3, 5, 'Project: created record'), - 2 => array(5, 5, 'Project: deleted record'), - 3 => array(4, 5, 'Project: updated record'), - 4 => array(1, 5, 'Project: ERROR'), - 5 => array(3, 6, 'Helpdesk: Created record'), - 6 => array(4, 6, 'Helpdesk: Updated record'), - 7 => array(2, 6, 'Helpdesk: Information'), - 8 => array(1, 6, 'Helpdesk: ERROR'), - 9 => array(6, 6, 'Helpdesk: Report'), - 10 => array(3, 7, 'Task: created record'), - 11 => array(5, 7, 'Task: deleted record'), - 12 => array(4, 7, 'Task: updated record'), - 13 => array(1, 1, 'Database Error'), - 14 => array(6, 5, 'Project: Activity Report'), - 15 => array(6, 7, 'Task: Activity Report'), - 16 => array(3, 2, 'User logged-in'), - 17 => array(5, 2, 'User logged-out'), - 18 => array(6, 2, 'Login/Logout Report'), - 19 => array(3, 8, 'Tags: created record'), - 20 => array(5, 8, 'Tags: deleted record'), - 21 => array(4, 8, 'Tags: updated record'), - 22 => array(6, 8, 'Tags: Activity Report'), - 23 => array(1, 2, 'Authentication: ERROR'), - 24 => array(2, 10, 'Navigation: Viewed page'), - 25 => array(4, 9, 'Update: Estimates'), - 26 => array(1, 9, 'Error: Estimates'), - 27 => array(2, 5, 'Information: Project'), - 28 => array(4, 3, 'Update: Users'), - 29 => array(1, 7, 'Error: Task'), - 30 => array(3, 3, 'Create: Users') - ); - - foreach($logEvents as $logEventId => $subArr) { - $insertArr = array( - 'log_event_id' => $logEventId, - 'log_class_id' => $subArr[0], - 'log_category_id' => $subArr[1], - 'description' => $subArr[2] - ); - $sql = "INSERT INTO log_event_table ". $this->gfObj->string_from_array($insertArr, 'insert', NULL, 'sql'); - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - $counter++; - $this->totalRecords++; - } - else { - throw new exception(__METHOD__ .": failed to create log_event_id #". $insertArr['log_event_id'] - .", description: ". $insertArr['description'] ."<BR>\nERROR::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - - //FINAL SANITY CHECKS!!! - if($counter == (count($classes) + count($categories) + count($logEvents))) { - - //reset the sequence. - $sql = "SELECT setval('log_event_table_log_event_id_seq', (SELECT max(log_event_id) FROM log_event_table))"; - if($this->run_sql($sql) === TRUE) { - $retval = "Successfully created all category, class, and log event records (". $counter .")"; - } - else { - throw new exception(__METHOD__ .": failed to reset sequence for log_event table::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - else { - throw new exception(__METHOD__ .": Internal error, failed to create all category and class records"); - } - } - else { - throw new exception(__METHOD__ .": failed to reset sequence for log_category_table::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - else { - throw new exception(__METHOD__ .": failed to reset sequence for log_class_table::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - - return($retval); - - }//end create_log_categories_and_classes() - //========================================================================= - - - - //========================================================================= - private function create_attributes() { - $attributes = array( - 3 => array('phone', 'phone', 'Phone'), - 4 => array('fax', 'phone', 'Fax'), - 5 => array('cell', 'phone', 'Cell'), - 6 => array('im_yahoo', 'alphanumeric', 'IM: Yahoo'), - 7 => array('im_skype', 'alphanumeric', 'IM: Skype'), - 8 => array('im_aol', 'alphanumeric', 'IM: AOL'), - 9 => array('im_msn', 'alphanumeric', 'IM: MSN'), - 10 => array('im_icq', 'alphanumeric', 'IM: ICQ'), - 11 => array('address', 'sql', 'Address'), - 12 => array('city', 'alphanumeric', 'City'), - 13 => array('state', 'alphanumeric', 'State'), - 14 => array('zip', 'alphanumeric', 'Zip') - ); - - $retval = 0; - foreach($attributes as $attributeId => $subData) { - $insertArr = array( - 'attribute_id' => $attributeId, - 'name' => $subData[0], - 'clean_as' => $subData[1], - 'display_name' => $subData[2] - ); - $sql = "INSERT INTO attribute_table ". $this->gfObj->string_from_array($insertArr, 'insert', NULL, 'sql'); - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - $retval++; - $this->totalRecords++; - } - else { - throw new exception(__METHOD__ .": failed to insert data for attribute (". $insertArr['name'] .")::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - - if($retval == count($attributes)) { - $sql = "SELECT setval('attribute_table_attribute_id_seq'::text, (SELECT max(attribute_id) FROM attribute_table))"; - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - $retval = "Successfully created all attributes (". $retval .")!"; - } - else { - throw new exception(__METHOD__ .": failed to reset sequence::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - else { - throw new exception(__METHOD__ .": internal error (sanity check failed)"); - } - - return($retval); - }//end create_attributes() - //========================================================================= - - - - //========================================================================= - /** - * Create the anonymous user. This includes their contact data and the - * default group. - * - * TODO: change "short_name" into "display_name". - */ - private function create_anonymous_contact_data() { - $allRecords = array( - 'disabled group' => array( - 'name' => 'group_table', - 'data' => array( - 'group_id' => 0, - 'name' => 'disabled', - 'short_name' => 'DISABLED', - 'leader_uid' => 0 - ), - ), - 'anonymous record in user table' => array( - 'name' => 'user_table', - 'data' => array( - 'uid' => 0, - 'username' => 'Anonymous', - 'password' => 'disabled', //this is PURPOSELY an invalid password (passwords should be 32-char md5's - 'is_admin' => 'f', - 'is_active' => 'f', - 'group_id' => 0, - 'contact_id' => 0 - ), - ), - 'default group' => array( - 'name' => 'group_table', - 'data' => array( - 'group_id' => 1, - 'name' => 'default', - 'short_name' => '-DEFAULT-', - 'leader_uid' => 0 - ), - ), - 'anonymous contact record' => array( - 'name' => 'contact_table', - 'data' => array( - 'contact_id' => 0, - 'company' => '', - 'fname' => 'Anonymous', - 'lname' => '', - 'contact_email_id' => '-1' - ) - ), - 'anonymous email record' => array( - 'name' => 'contact_email_table', - 'data' => array( - 'contact_id' => 0, - 'email' => 'ano...@nu...' - ) - ) - ); - - $retval = 0; - foreach($allRecords as $operationName => $subData) { - $tableName = $subData['name']; - $insertArr = $subData['data']; - - $sql = "INSERT INTO ". $tableName ." ". $this->gfObj->string_from_array($insertArr, 'insert', NULL, 'sql'); - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - $this->totalRecords++; - $retval++; - } else { - throw new exception(__METHOD__. ": failed perform operation (". $operationName .") for table (". $tableName .")::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - - $sql = "SELECT currval('contact_email_table_contact_email_id_seq'::text)"; - if($this->run_sql($sql)) { - $data = $this->db->farray(); - $sql = "UPDATE contact_table SET contact_email_id=". $data[0] ." WHERE contact_id=0"; - if($this->run_sql($sql)) { - $this->totalRecords++; - } - else { - throw new exception(__METHOD__ .": failed to set contact_email_id for anonymous"); - } - } - else { - throw new exception(__METHOD__ .": failed to get sequence for contact_email_table"); - } - - if($retval == count($allRecords)) { - //reset the sequence for the group table... - $sql = "SELECT setval('group_table_group_id_seq'::text, (SELECT max(group_id) FROM group_table))"; - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - //good to go. - $retval = "Successfully created anonymous user, anonymous contact record, and the two default groups (". $retval .")!"; - } - else { - throw new exception(__METHOD__ .": failed to reset group sequence::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - else { - throw new exception(__METHOD__ .": internal error (failed sanity check)"); - } - - return($retval); - }//end create_anonymous_contact_data() - //========================================================================= - - - //========================================================================= - private function create_status_records() { - //format: {status_id} => array({name}, {description}) - $statuses = array( - 0 => array('New/Offered', 'New record'), - 1 => array('Pending', 'Not new: pending review, or nearly complete.'), - 2 => array('Running/Accepted', 'Work is underway'), - 3 => array('Stalled', 'Unable to complete, or dependent on other things.'), - 4 => array('Ended/Solved', 'Work is complete!'), - 5 => array('Rejected', 'Denied.'), - 6 => array('Re-opened', 'Was solved, but is once again open.'), - ); - - $retval = 0; - foreach($statuses as $statusId => $subData) { - $insertArr = array( - 'status_id' => $statusId, - 'name' => $subData[0], - 'description' => $subData[1] - ); - $sql = "INSERT INTO status_table ". $this->gfObj->string_from_array($insertArr, 'insert', NULL, 'sql'); - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - $retval++; - $this->totalRecords++; - } - else { - throw new exception(__METHOD__ .": failed to create status (". $insertArr['name'] .")::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - - if($retval == count($statuses)) { - //reset the status_table.status_id sequence... - $sql = "SELECT setval('status_table_status_id_seq'::text, (SELECT max(status_id) FROM status_table))"; - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - //good to go. - $retval = "Successfully created all status records (". $retval .")!"; - } - else { - throw new exception(__METHOD__ .": failed to reset status sequence::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - else { - throw new exception(__METHOD__ .": internal error (failed sanity check)"); - } - - return($retval); - - }//end create_status_records() - //========================================================================= - - - - //========================================================================= - private function create_tag_names() { - $tags = array( - 1 => 'bug', - 2 => 'feature request', - 3 => 'information', - 4 => 'network related', - 5 => 'critical', - 6 => 'exception' - ); - - $retval = 0; - foreach($tags as $id=>$name) { - $insertArr = array( - 'tag_name_id' => $id, - 'name' => $name - ); - $sql = "INSERT INTO tag_name_table ". $this->gfObj->string_from_array($insertArr, 'insert', NULL, 'sql'); - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - $retval++; - $this->totalRecords++; - } - else { - throw new exception(__METHOD__ .": failed to insert data for (". $name .")::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - - if($retval == count($tags)) { - //reset sequence for tag_name_table.tag_name_id - $sql = "SELECT setval('tag_name_table_tag_name_id_seq'::text, (SELECT max(tag_name_id) FROM tag_name_table))"; - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - //good to go. - $retval = "Successfully created all tags (". $retval .")!"; - } - else { - throw new exception(__METHOD__ .": failed to reset tag_name sequence::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - else { - throw new exception(__METHOD__ .": internal error (sanity check failed)"); - } - - return($retval); - }//end create_tag_names() - //========================================================================= - - - - //========================================================================= - private function build_preferences() { - //format: {pref_type_id} => array({name}, {default_value}, {display_name}, {description}) - $prefTypes = array( - 1 => array('startModule', 'helpdesk', 'Starting on Module', 'Defines which section will be loaded upon login if nothing was selected.'), - 5 => array('sorting_helpdesk', 'public_id|DESC', 'Helpdesk Sorting', 'Define the type of sorting for the helpdesk page.'), - 6 => array('sorting_project', 'priority|ASC', 'Project Sorting', 'Define the type of sorting for the helpdesk page.'), - 7 => array('projectDetails_taskDisplayOnlyMine', 'all', 'Project Details: Task display', 'Define what tasks are displayed on a project\\\'s details page.'), - 8 => array('projectDetails_showCompletedIssues', '1', 'Project Details: Display completed issues', 'Should completed issues display in the details of a project?') - ); - - $retval = 0; - foreach($prefTypes as $prefTypeId => $subData) { - $insertArr = array( - 'pref_type_id' => $prefTypeId, - 'name' => $subData[0], - 'default_value' => $subData[1], - 'display_name' => $subData[2], - 'description' => $subData[3] - ); - - $sql = "INSERT INTO pref_type_table ". $this->gfObj->string_from_array($insertArr, 'insert', NULL, 'sql_insert'); - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - $retval++; - $this->totalRecords++; - } - else { - throw new exception(__METHOD__ .": failed to insert data for (". $insertArr['name'] .")::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - - if($retval == count($prefTypes)) { - //format: {pref_option_id} => array({pref_type_id}, {name}, {effective_value}) - $prefOptions = array( - 1 =>array(1, 'Helpdesk', 'helpdesk'), - 2 =>array(1, 'Projects', 'project'), - 3 =>array(1, 'Summary ', 'summary'), - 8 =>array(5, 'ID - Descending', 'public_id|DESC'), - 9 =>array(5, 'ID - Ascending', 'public_id|ASC'), - 10 =>array(5, 'Priority - Descending', 'priority|DESC'), - 11 =>array(5, 'Priority - Ascending', 'priority|ASC'), - 12 =>array(5, 'Submit - Descending', 'start_date|DESC'), - 13 =>array(5, 'Submit - Ascending', 'start_date|ASC'), - 14 =>array(5, 'Title - Descending', 'name|DESC'), - 15 =>array(5, 'Title - Ascending', 'name|DESC'), - 16 =>array(5, 'Status ID - Descending', 'status_id|DESC'), - 17 =>array(5, 'Status ID - Ascending', 'status_id|DESC'), - 18 =>array(5, 'Assigned - Descending', 'assigned|DESC'), - 19 =>array(5, 'Assigned - Ascending', 'assigned|DESC'), - 20 =>array(6, 'Priority - Ascending', 'priority|ASC'), - 21 =>array(6, 'Priority - Descending', 'priority|DESC'), - 22 =>array(6, 'Name of Project - Ascending', 'name|ASC'), - 23 =>array(6, 'Name of Project - Descending', 'name|DESC'), - 24 =>array(6, 'Begin - Ascending', 'start_date|ASC'), - 25 =>array(6, 'Begin - Descending', 'start_date|DESC'), - 26 =>array(6, 'End - Ascending', 'end|ASC'), - 27 =>array(6, 'End - Descending', 'end|DESC'), - 28 =>array(6, 'Status ID - Ascending', 'status_id|ASC'), - 29 =>array(6, 'Status ID - Descending', 'status_id|DESC'), - 30 =>array(6, 'Progress - Ascending', 'progress|ASC'), - 31 =>array(6, 'Progress - Descending', 'progress|DESC'), - 32 =>array(6, 'Leader - Ascending', 'leader_contact_id|ASC'), - 33 =>array(6, 'Leader - Descending', 'leader_contact_id|DESC'), - 34 =>array(7, 'Show everything', 'all'), - 35 =>array(7, 'All of mine (created & assigned)', 'mine'), - 36 =>array(7, 'Only my assigned items', 'assigned'), - 37 =>array(8, 'Yes', '1'), - 38 =>array(8, 'No', '0'), - ); - - foreach($prefOptions as $prefOptionId => $subData) { - $insertArr = array( - 'pref_option_id' => $prefOptionId, - 'pref_type_id' => $subData[0], - 'name' => $subData[1], - 'effective_value' => $subData[2] - ); - $sql = "INSERT INTO pref_option_table ". $this->gfObj->string_from_array($insertArr, 'insert', NULL, 'sql'); - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - $retval++; - $this->totalRecords++; - } - else { - throw new exception(__METHOD__ .": failed to insert data for pref option (". $insertArr['name'] .")::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - - if($retval == (count($prefTypes) + count($prefOptions))) { - //reset the pref_type_table.pref_type_id sequence. - $sql = "SELECT setval('pref_type_table_pref_type_id_seq'::text, (SELECT max(pref_type_id) FROM pref_type_table))"; - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - if($retval == (count($prefTypes) + count($prefOptions))) { - //reset the pref_option_table.pref_option_id sequence. - $sql = "SELECT setval('pref_option_table_pref_option_id_seq'::text, (SELECT max(pref_option_id) FROM pref_option_table))"; - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - $retval = "Successfully created all preferences and options (". $retval .")!"; - } - else { - throw new exception(__METHOD__ .": failed to reset the pref_option sequence::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - else { - throw new exception(__METHOD__ .": internal error (sanity check #2 failed)"); - } - } - else { - throw new exception(__METHOD__ .": failed to reset pref_type sequence::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - else { - throw new exception(__METHOD__ .": internal error (sanity check #2 failed): (". $retval ." != ". (count($prefTypes) + count($prefOptions)) .")"); - } - } - else { - throw new exception(__METHOD__ .": internal error (sanity check #1 failed)"); - } - - return($retval); - - }//end build_preferences() - //========================================================================= - - - - //========================================================================= - private function create_users() { - - //retrieve the user information. - $userData = get_setup_data(3, 'post_info'); - if(!is_array($userData) || count($userData) != 2) { - throw new exception(__METHOD__ .": no user data...?". $this->gfObj->debug_print($userData,0)); - } - - $counter = 0; - $retval = "Successfully created records for::: "; - foreach($userData as $num => $subData) { - - //split their name up, based upon spaces. - $nameData = explode(' ', $subData['name']); - $insertArr = array(); - if(count($nameData) == 1) { - $insertArr['fname'] = $nameData[0]; - $insertArr['lname'] = ""; - } - elseif(count($nameData) == 2) { - $insertArr['fname'] = $nameData[0]; - $insertArr['lname'] = $nameData[1]; - } - else { - $insertArr['fname'] = $nameData[0]; - $insertArr['lname'] = preg_replace('/^'. $insertArr['fname'] .' /', '', $subData['name']); - } - $insertArr['contact_email_id'] = '-1'; - - //create their contact record. - $sql = "INSERT INTO contact_table ". $this->gfObj->string_from_array($insertArr, 'insert', NULL, 'sql'); - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - $sql = "SELECT currval('contact_table_contact_id_seq'::text)"; - if($this->run_sql($sql, 1) === TRUE) { - $this->totalRecords++; - - $data = $this->db->farray(); - $contactId = $data[0]; - - //now create the user. - $xUser = $subData['username']; - $insertArr = array( - 'username' => $subData['username'], - 'password' => md5($subData['password'] .'_'. $contactId), - 'is_admin' => interpret_bool($subData['is_admin'], array('f', 't')), - 'contact_id' => $contactId - ); - $sql = "INSERT INTO user_table ". $this->gfObj->string_from_array($insertArr, 'insert', NULL, 'sql'); - - if($this->run_sql($sql, 1) === TRUE) { - $sql = "SELECT currval('user_table_uid_seq'::text)"; - if($this->run_sql($sql,1) === TRUE) { - $data = $this->db->farray(); - $lastUid = $data[0]; - - //create an email address for them. - $sql = "INSERT INTO contact_email_table (contact_id, email) VALUES (". $contactId .", '". strtolower($subData['email']) ."')"; - if($this->run_sql($sql,1) === TRUE) { - $counter++; - //get the newly inserted id, so we can update the contact table. - if($this->run_sql("SELECT currval('contact_email_table_contact_email_id_seq'::text)")) { - $data = $this->db->farray(); - $contactEmailId = $data[0]; - - $sql = "UPDATE contact_table SET contact_email_id=". $contactEmailId ." WHERE contact_id=". $contactId; - if($this->run_sql($sql)) { - $retval = $this->gfObj->create_list($retval, " --- Created record for ". $subData['username'] ." (". $lastUid .")", "<BR>\n"); - } - else { - throw new exception(__METHOD__ .": unable to update contact table with new contact_email_id..."); - } - } - else { - throw new exception(__METHOD__ .": failed to retrieve contact_email_id"); - } - } - else { - throw new exception(__METHOD__ .": failed to create email for ". $subData['username'] ."::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - else { - throw new exception(__METHOD__ .": failed to retrieve uid for ". $subData['username'] ."::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - else { - throw new exception(__METHOD__ .": failed to create user record for ". $subData['username'] ."::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - else { - throw new exception(__METHOD__ .": unable to retrieve contact_id for ". $subData['username'] ."::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - else { - throw new exception(__METHOD__ .": failed to create contact record for ". $subData['username'] ."::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - - if($counter == 2) { - $retval = $this->gfObj->create_list($retval, " --->>> done, created (". $counter .") records", "<BR>\n"); - } - else { - throw new exception(__METHOD__ .": failed to create users (". $counter .")::: ". $this->gfObj->debug_print($userData,0)); - } - - return($retval); - }//end create_users() - //========================================================================= - - - - //========================================================================= - public function finish(cs_genericPage &$page) { - - $stepRes = get_setup_data(3, 'result'); - if($stepRes == 1) { - $page->set_message_wrapper(array( - 'title' => "Successfully Setup Data", - 'message' => "All default data was stored in the new database successfully!", - 'type' => "status" - )); - store_setup_data(3, $this->data, 'data'); - $page->conditional_header("/setup/4", TRUE); - } - else { - $page->set_message_wrapper(array( - 'title' => "Step Failed", - 'message' => "Please review the errors below and proceed accordingly.", - 'type' => "error" - )); - $page->conditional_header("/setup/3", TRUE); - } - - }//end finish() - //========================================================================= - - - - //========================================================================= - protected function run_sql($sql, $expectedNumrows=NULL) { - if(strlen($sql)) { - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - $this->lastNumrows = $numrows; - $this->lastDberror = $dberror; - - if(!strlen($dberror) && $numrows >= 0) { - if(is_numeric($expectedNumrows)) { - if($expectedNumrows == $numrows) { - $retval = TRUE; - } - else { - $retval = FALSE; - } - } - else { - //don't care if it's numeric. - $retval = TRUE; - } - } - else { - throw new exception(__METHOD__ .": failed to run SQL, got numrows=(". $numrows ."), dberror::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - else { - throw new exception(__METHOD__ .": no SQL to run..."); - } - - return($retval); - }//end run_sql() - //========================================================================= - - - - //========================================================================= - private function create_user_group_records() { - $sql = "INSERT INTO user_group_table (uid, group_id) SELECT uid, group_id FROM user_table"; - if($this->run_sql($sql, 3) === TRUE) { - $retval = "Successfully created user_group linkage."; - } - else { - throw new exception(__METHOD__ .": unable to create user group records::: ". $this->lastDberror ."<BR>\nSQL::: ". $sql); - } - return($retval); - }//end create_user_group_records() - //========================================================================= - - -}//end __setupDefaultValues{} - - - -?> Copied: releases/1.2/lib/_setup/__setupDefaultValues.class.php (from rev 992, trunk/1.2/lib/_setup/__setupDefaultValues.class.php) =================================================================== --- releases/1.2/lib/_setup/__setupDefaultValues.class.php (rev 0) +++ releases/1.2/lib/_setup/__setupDefaultValues.class.php 2009-10-26 03:15:10 UTC (rev 996) @@ -0,0 +1,974 @@ +<?php +/* + * Created on Aug 23, 2007 + * + * SVN INFORMATION::: + * ------------------- + * Last Author::::::::: $Author$ + * Current Revision:::: $Revision$ + * Repository Location: $HeadURL$ + * Last Updated:::::::: $Date$ + */ + +class __setupDefaultValues extends cs_webdbupgrade { + + + protected $db; + private $totalRecords=0; + + private $data=array(); + + private $lastNumrows=NULL; + private $lastDberror=NULL; + + //========================================================================= + public function __construct() { + $this->db = new cs_phpDB; + $this->gfObj = new cs_globalFunctions; + }//end __construct() + //========================================================================= + + + + //========================================================================= + public function go() { + store_setup_data(3, 0, 'result'); + try { + $params = get_db_params(); + $this->db->connect($params); + $this->db->beginTrans(__METHOD__); + $retval = "Connected successfully to the database."; + + //now that we've connected, start doing stuff. + $retval = $this->set_version(); + $retval .= "<BR>\n". $this->create_log_categories_and_classes(); + $retval .= "<BR>\n". $this->create_attributes(); + $retval .= "<BR>\n". $this->create_anonymous_contact_data(); + $retval .= "<BR>\n". $this->create_status_records(); + $retval .= "<BR>\n". $this->create_tag_names(); + $retval .= "<BR>\n". $this->build_preferences(); + $retval .= "<BR>\n". $this->create_users(); + $retval .= "<BR>\n". $this->create_user_group_records(); + + $commitRes = $this->db->commitTrans(); + if($commitRes == 1) { + $retval .= "<BR>\n ----------- Created (". $this->totalRecords ."), result of commit: (". $commitRes .")."; + store_setup_data(3, 1, 'result'); + store_setup_data(4, 1, 'accessible'); + } + else { + $this->db->rollbackTrans(); + store_setup_data(3, 0, 'result'); + throw new exception(__METHOD__ .": failed to commit the transaction (". $commitRes .")"); + } + + } + catch(exception $e) { + //TODO: rollback the transaction + $retval = "An error occurred: ". $e->getMessage(); + } + + return($retval); + + }//end go() + //========================================================================= + + + + //========================================================================= + /** + * Set version information into the database for future upgradeability. + */ + private function set_version() { + //get the version string. + $fullVersionString = read_version_file(); + + $suffixData = explode('-', $fullVersionString); + if(count($suffixData) == 2 && preg_match('/\./', $suffixData[0]) && !preg_match('/\./', $suffixData[1])) { + //there's a suffix, and it doesn't contain periods (i.e. "1.0.0-ALPHA1") + $suffix = $suffixData[1]; + } + elseif(count($suffixData) == 1) { + //no suffix. + $suffix = ""; + } + else { + //there's a dash in the name, but it's invalid or contains periods (i.e. "BETA-1.0.0" or "1.0.0-ALPHA1.0") + throw new exception(__METHOD__ .": version string is invalid (". $fullVersionString ."), suffix contains dashes, or there is a prefix"); + } + + //remove the suffix & parse it. + $versionString = $suffixData[0]; + $versionData = $this->parse_version_string($fullVersionString); + $sqlData = $versionData; + + + #$sqlData = array( + # 'version_string' => $fullVersionString, + # 'version_major' => $versionData[0], + # 'version_minor' => $versionData[1], + # 'version_maintenance' => $versionData[2], + # 'version_suffix' => $suffix + #); + + $retval = 0; + foreach($sqlData as $name => $value) { + $sql = "SELECT internal_data_set_value('". $name ."', '". $value ."')"; + $numrows = $this->db->exec($sql); + $dberror = $this->db->errorMsg(); + + if(!strlen($dberror) && $numrows == 1) { + $retval++; + $this->totalRecords++; + } + else { + throw new exception(__METHOD__ .": failed to set (". $name .") as (". $value .")::: ". $dberror); + } + } + + if($retval == count($sqlData)) { + //okay, the final test: run a query that straps everything together, to ensure it all has the same version. + $sql = "SELECT internal_data_get_value('version_major') || '.' || internal_data_get_value('version_minor') " . + " || '.' || internal_data_get_value('version_maintenance') as text, " . + "internal_data_get_value('... [truncated message content] |
From: <cra...@us...> - 2009-10-26 03:11:43
|
Revision: 995 http://cs-project.svn.sourceforge.net/cs-project/?rev=995&view=rev Author: crazedsanity Date: 2009-10-26 03:11:30 +0000 (Mon, 26 Oct 2009) Log Message: ----------- v1.2.0-ALPHA13 part 1. Modified Paths: -------------- releases/1.2/includes/content/contacts/index.inc releases/1.2/includes/content/contacts/view.inc releases/1.2/includes/content/project/index.inc releases/1.2/includes/content.inc releases/1.2/includes/extern/helpdesk.inc releases/1.2/includes/extern.inc releases/1.2/includes/help.inc releases/1.2/includes/login.inc releases/1.2/includes/setup/1.inc releases/1.2/includes/setup/2.inc releases/1.2/includes/setup/3.inc releases/1.2/includes/setup/5.inc releases/1.2/includes/setup.inc Added Paths: ----------- releases/1.2/bin/convertimages.bash releases/1.2/includes/extern/shared.inc Copied: releases/1.2/bin/convertimages.bash (from rev 992, trunk/1.2/bin/convertimages.bash) =================================================================== --- releases/1.2/bin/convertimages.bash (rev 0) +++ releases/1.2/bin/convertimages.bash 2009-10-26 03:11:30 UTC (rev 995) @@ -0,0 +1,19 @@ +#!/bin/bash + +PATTERN=$1 + + +for F in `ls $PATTERN*.png` +do + name=`echo "$F" | sed -e "s/.png$/.gif/"` + echo -n $name + convert $F $name + echo -n ".." + rm $F + echo -n ".." + svn add $name > /dev/null + echo -n ".." + svn rm $F > /dev/null + echo -n ".." + echo " DONE" +done; Modified: releases/1.2/includes/content/contacts/index.inc =================================================================== --- releases/1.2/includes/content/contacts/index.inc 2009-10-26 01:31:26 UTC (rev 994) +++ releases/1.2/includes/content/contacts/index.inc 2009-10-26 03:11:30 UTC (rev 995) @@ -10,8 +10,6 @@ * Last Updated: $Date$ */ -require_once(dirname(__FILE__) .'/../../../lib/contactClass.php'); - $contactObj = new contactClass($page->db); $page->allow_invalid_urls(TRUE); Modified: releases/1.2/includes/content/contacts/view.inc =================================================================== --- releases/1.2/includes/content/contacts/view.inc 2009-10-26 01:31:26 UTC (rev 994) +++ releases/1.2/includes/content/contacts/view.inc 2009-10-26 03:11:30 UTC (rev 995) @@ -10,8 +10,6 @@ * Last Updated: $Date$ */ -require_once(dirname(__FILE__) .'/../../../lib/contactClass.php'); - $contactObj = new contactClass($page->db); $page->allow_invalid_urls(TRUE); Modified: releases/1.2/includes/content/project/index.inc =================================================================== --- releases/1.2/includes/content/project/index.inc 2009-10-26 01:31:26 UTC (rev 994) +++ releases/1.2/includes/content/project/index.inc 2009-10-26 03:11:30 UTC (rev 995) @@ -29,7 +29,6 @@ } $page->ui->set_cache("expandArr", $expandArr); - #$page->change_content(html_file_to_string("modules/project/project_main.tmpl")); $page->set_all_block_rows("content"); //set some template vars for the filtering. Modified: releases/1.2/includes/content.inc =================================================================== --- releases/1.2/includes/content.inc 2009-10-26 01:31:26 UTC (rev 994) +++ releases/1.2/includes/content.inc 2009-10-26 03:11:30 UTC (rev 995) @@ -8,12 +8,10 @@ * Last Updated:::::::: $Date$ */ -require_once(dirname(__FILE__) ."/../lib/cs-content/cs_tabs.class.php"); - $db = new cs_phpDB; $db->connect(get_config_db_params()); -$page->db = &$db; +$page->db = $db; $page->session = new Session($page->db); @@ -93,7 +91,7 @@ //check for old misspellings, and fix them. $defaultModule = "project"; } - conditional_header("/content/$defaultModule"); + conditional_header("/content/". $defaultModule); exit; } @@ -132,7 +130,7 @@ 'tags' => "Tags", ); -$tabObj = new cs_tabs($page); +$tabObj = new cs_tabs(); foreach($tabNames as $moduleName=>$name) { $tabUrl = "/content/". $moduleName; @@ -142,6 +140,7 @@ $tabObj->add_tab($name, $tabUrl); } + if($user->is_admin()) { $name = "Admin"; $tabObj->add_tab($name, "/content/settings/admin"); @@ -149,7 +148,8 @@ $tabObj->select_tab($name); } } -$tabObj->display_tabs(); +$page->rip_all_block_rows('tabs'); +$page->add_template_var('tabs', $tabObj->display_tabs($page->templateRows)); Modified: releases/1.2/includes/extern/helpdesk.inc =================================================================== --- releases/1.2/includes/extern/helpdesk.inc 2009-10-26 01:31:26 UTC (rev 994) +++ releases/1.2/includes/extern/helpdesk.inc 2009-10-26 03:11:30 UTC (rev 995) @@ -19,6 +19,9 @@ if($postAction == "remark") { $helpdeskId = $_POST['ID']; + $_SESSION['POST_remark'] = $_POST['remark']; + + if($captchaResult === true) { if(is_numeric($helpdeskId)) { //now check to make sure they can actually remark on it... $helpdeskData = $proj->helpdeskObj->get_record($helpdeskId); @@ -45,6 +48,7 @@ "message" => "Your remark has been added to the database. Thank you for your feedback.", "type" => "status" )); + unset($_SESSION['POST_remark']); } else { set_message_wrapper(array( @@ -76,32 +80,17 @@ conditional_header("/extern/helpdesk/"); exit; } - } - elseif($_POST && strtolower($_POST['submit']) == "go" && !isset($_POST['action'])) { - //they're CREATING an issue. - $result = $proj->helpdeskObj->create_record($_POST['data']); - - //first, determine what happened from the result... - if($result > 0) { - //everything worked. - set_message_wrapper(array( - "title" => "Issue Successfully Created", - "message" => "Your issue has been added to the helpdesk. You should receive an email shortly with confirmation.", - "type" => "notice" - )); } else { - //something failed. + //didn't give me the proper captcha data... set_message_wrapper(array( - "title" => "Unable to Create Issue", - "message" => "Something broke. Sorry.", - "type" => "notice" + 'title' => "Captcha Failed", + 'message' => "You didn't answer the CAPTCHA correctly. Are you really a person?", + 'type' => "error" )); + conditional_header("/extern/helpdesk/view?ID=". $helpdeskId); + exit; } - - //send 'em packing. - conditional_header("/extern/helpdesk/view?ID=$result"); - exit; } elseif($_POST['action'] == "filter") { if($_POST['reset_filter']) { @@ -118,6 +107,7 @@ } } else { + $page->add_template_var('POST_remark', $_SESSION['POST_remark']); $action = $page->ftsSections[2]; $helpdeskId = $_GET['ID']; $page->add_template_var("id", $helpdeskId); @@ -211,7 +201,6 @@ //================================================================================================================ $titleSub = "Show All"; //change the content of the page properly. - #$page->change_content(html_file_to_string("modules/helpdesk/helpdesk_main.tmpl")); $page->set_all_block_rows("content", array("helpdesk_search")); $filterData = $page->ui->get_cache("filter"); Copied: releases/1.2/includes/extern/shared.inc (from rev 992, trunk/1.2/includes/extern/shared.inc) =================================================================== --- releases/1.2/includes/extern/shared.inc (rev 0) +++ releases/1.2/includes/extern/shared.inc 2009-10-26 03:11:30 UTC (rev 995) @@ -0,0 +1,40 @@ +<?php +/* + * Created on Oct 23, 2009 + * + * SVN INFORMATION::: + * ------------------- + * Last Author::::::::: $Author$ + * Current Revision:::: $Revision$ + * Repository Location: $HeadURL$ + * Last Updated:::::::: $Date$ + */ + +require_once(constant('LIBDIR') .'/recaptchalib.php'); + +//TODO: put these into the site config and make 'em constants. +// Get a key from http://recaptcha.net/api/getkey + +$error = null; +$resp = null; + +$captchaResult = false; + +if($_POST && isset($_POST["recaptcha_challenge_field"])) { + $resp = recaptcha_check_answer (constant('RECAPTCHA_PRIVATEKEY'), + $_SERVER["REMOTE_ADDR"], + $_POST["recaptcha_challenge_field"], + $_POST["recaptcha_response_field"] + ); + if($resp->is_valid) { + $captchaResult = true; + } + else { + $error = $resp->error; + } +} + + +$page->add_template_var('captcha', recaptcha_get_html(constant('RECAPTCHA_PUBLICKEY'), $error)); + +?> Modified: releases/1.2/includes/extern.inc =================================================================== --- releases/1.2/includes/extern.inc 2009-10-26 01:31:26 UTC (rev 994) +++ releases/1.2/includes/extern.inc 2009-10-26 03:11:30 UTC (rev 995) @@ -15,7 +15,7 @@ $db = new cs_phpDB; $db->connect(get_config_db_params()); -$page->db = &$db; +$page->db = $db; //The "sectionArr" is provided from contentSystem::finish() as a local var, and ftsSections is a leftover from fast_templating. $page->ftsSections = $sectionArr; Modified: releases/1.2/includes/help.inc =================================================================== --- releases/1.2/includes/help.inc 2009-10-26 01:31:26 UTC (rev 994) +++ releases/1.2/includes/help.inc 2009-10-26 03:11:30 UTC (rev 995) @@ -9,7 +9,7 @@ $db = new cs_phpDB; $db->connect(get_config_db_params()); -$page->db = &$db; +$page->db = $db; #$titlePart = NULL; Modified: releases/1.2/includes/login.inc =================================================================== --- releases/1.2/includes/login.inc 2009-10-26 01:31:26 UTC (rev 994) +++ releases/1.2/includes/login.inc 2009-10-26 03:11:30 UTC (rev 995) @@ -13,7 +13,7 @@ $db = new cs_phpDB; $db->connect(get_config_db_params()); -$page->db = &$db; +$page->db = $db; $page->add_template_var('cs-project_version', VERSION_STRING); $page->add_template_var('MAINTABLE_EXTRA', 'align="center"'); Modified: releases/1.2/includes/setup/1.inc =================================================================== --- releases/1.2/includes/setup/1.inc 2009-10-26 01:31:26 UTC (rev 994) +++ releases/1.2/includes/setup/1.inc 2009-10-26 03:11:30 UTC (rev 995) @@ -6,8 +6,6 @@ $requiredFields = array('dbname', 'host', 'port', 'user', 'password'); -//TODO: consider adding a check that the /lib directory is writable, to avoid errors later on. - if($_POST) { reset_all_steps(FALSE); store_setup_data(1, $_POST['fields']); @@ -42,11 +40,11 @@ } else { //check if the /lib dir is writeable, so they've been warned. - $fsObj = new cs_fileSystemClass(dirname(__FILE__) .'/../../lib'); + $fsObj = new cs_fileSystem(dirname(__FILE__) .'/../../rw'); if(!$fsObj->is_writable(NULL)) { $page->set_message_wrapper(array( 'title' => "Warning", - 'message' => "The lib directory of your install isn't writable. Please correct this <BR>\n" . + 'message' => "The 'rw' directory of your install isn't writable. Please correct this <BR>\n" . "before continuing, as setup will not be able create the config.xml file.", 'type' => 'notice' )); Modified: releases/1.2/includes/setup/2.inc =================================================================== --- releases/1.2/includes/setup/2.inc 2009-10-26 01:31:26 UTC (rev 994) +++ releases/1.2/includes/setup/2.inc 2009-10-26 03:11:30 UTC (rev 995) @@ -56,191 +56,4 @@ - -class __tmpSetupClass { - - - private $db; - private $fs; - private $page; - private $url = "/setup/1"; - - //========================================================================= - public function __construct(cs_phpDB &$db, cs_genericPage &$page) { - $this->db = $db; - $this->fsObj = new cs_fileSystemClass(dirname(__FILE__) .'/../../docs/sql/setup'); - $this->gfObj = new cs_globalFunctions; - $this->page = $page; - - store_setup_data(2, 0, 'result'); - store_setup_data(2, 'Initializing...', 'text'); - }//end __construct() - //========================================================================= - - - //========================================================================= - public function go() { - $retval = "Nothing done... something went horribly wrong."; - if($this->create_database()) { - $retval = $this->handle_plpgsql(); - - if($retval === TRUE) { - $retval = $this->load_schema(); - if($retval === TRUE) { - $this->page->set_message_wrapper( - array( - 'title' => "Step Successful", - 'message' => "Finished step two with result:::<BR>\n". get_setup_data(2,'text'), - 'type' => "status" - ) - ); - $this->page->conditional_header('/setup/3', TRUE); - } - else { - $retval = "There was an error while testing PL/PGSQL functionality: ". $retval; - store_setup_data(2, $retval, 'text'); - } - } - } - else { - store_setup_data(2, 0, 'result'); - store_setup_data(2, 'Failed to create database', 'text'); - $setupData = get_setup_data(1, 'data'); - $retval = "Unable to create database... check that ". $setupData['host'] . - " does not already have a database named '". $setupData['dbname'] ."'. " . - "Also, make sure no other user is connected to template1."; - } - - return($retval); - }//end go() - //========================================================================= - - - - //========================================================================= - private function create_database() { - $params = get_db_params(); - - //okay, let's try to create the database. - $numrows = $this->db->exec("CREATE DATABASE ". $params['dbname'] ." WITH ENCODING='SQL_ASCII'"); - $dberror = $this->db->errorMsg(); - - if(strlen($dberror)) { - $retval = FALSE; - } - else { - $retval = TRUE; - - //okay. Now destroy our database handle & create a new one, connected to the proper database. - unset($this->db); - $this->db = new cs_phpDb; - $this->db->connect(get_db_params()); - } - - return($retval); - }//end create_database() - //========================================================================= - - - //========================================================================= - private function load_schema() { - - store_setup_data(2, "Schema not loaded... ", 'text'); - store_setup_data(2, 0, 'result'); - - $fileData = $this->fsObj->read("01__storedprocs.sql"); - - //now we'll try to push that into the database. - $this->db->beginTrans(); - - $this->gfObj->debug_print("Loading stored procedures... "); - - $this->db->exec($fileData); - $dberror = $this->db->errorMsg(); - - if(strlen($dberror)) { - $this->db->rollbackTrans(); - $retval = $dberror; - } - else { - //keep going - $retval = "Successfully loaded stored procedures! Loading tables...."; - $this->gfObj->debug_print($retval); - - $fileData = $this->fsObj->read("02__tables.sql"); - $this->db->exec($fileData); - $dberror = $this->db->errorMsg(); - - if(strlen($dberror)) { - $this->db->rollbackTrans(); - $retval = $dberror; - } - else { - $retval = "Done loading tables!!! Creating indexes and miscellaneous other things..."; - $this->gfObj->debug_print($retval); - - $fileData = $this->fsObj->read("03__indexes_etc.sql"); - $this->db->exec($fileData); - $dberror = $this->db->errorMsg(); - - if(strlen($dberror)) { - $this->db->rollbackTrans(); - $retval = $dberror; - } - else { - $retval = "All stored procedures, tables, and indexes have been created!"; - $this->gfObj->debug_print($retval); - - $this->db->commitTrans(); - store_setup_data(2, array(), 'data'); - store_setup_data(2, 1, 'result'); - store_setup_data(2, $retval, 'text'); - store_setup_data(3, 1, 'accessible'); - - $retval = TRUE; - } - } - } - - return($retval); - }//end load_schema() - //========================================================================= - - - - //========================================================================= - /** - * Try to load PL/pgsql functions... - * - * NOTE: this is a terrible requirement, which requires PostgreSQL to be - * compiled with certain options... - */ - private function handle_plpgsql() { - $this->db->beginTrans(); - $fileData = $this->fsObj->read("plpgsql.sql"); - - $numrows = $this->db->exec($fileData); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror)) { - $this->db->commitTrans(); - $retval = TRUE; - } - else { - //figure out WHY this failed: if they're already loaded it's okay, otherwise it's bad. - $this->db->rollbackTrans(); - - if(preg_match('/"plpgsql_call_handler" already exists/', $dberror)) { - $retval = TRUE; - } - else { - $retval = $dberror; - } - } - - return($retval); - }//end handle_plpgsql() - //========================================================================= -} - ?> \ No newline at end of file Modified: releases/1.2/includes/setup/3.inc =================================================================== --- releases/1.2/includes/setup/3.inc 2009-10-26 01:31:26 UTC (rev 994) +++ releases/1.2/includes/setup/3.inc 2009-10-26 03:11:30 UTC (rev 995) @@ -7,9 +7,15 @@ if($_POST) { $validSubmission = test_submitted_data($page, $_POST['users']); - if($validSubmission === TRUE) { - $obj = new __setupDefaultValues(); - store_setup_data(3, $obj->go(), 'text'); + if($validSubmission === TRUE) { + try { + $obj = new __setupDefaultValues(); + $storeThis = $obj->go(); + } + catch(exception $e) { + $storeThis = "An error occurred::: ". $e->getMessage(); + } + store_setup_data(3, $storeThis, 'text'); $obj->finish($page); } else { @@ -117,989 +123,4 @@ - - - - - -class __setupDefaultValues extends upgrade { - - - protected $db; - private $gfObj; - private $totalRecords=0; - - private $data=array(); - - private $lastNumrows=NULL; - private $lastDberror=NULL; - - //========================================================================= - public function __construct() { - $this->db = new cs_phpDB; - $this->gfObj = new cs_globalFunctions; - }//end __construct() - //========================================================================= - - - - //========================================================================= - public function go() { - store_setup_data(3, 0, 'result'); - try { - $params = get_db_params(); - $this->db->connect($params); - $this->db->beginTrans(__METHOD__); - $retval = "Connected successfully to the database."; - - //now that we've connected, start doing stuff. - $retval = $this->set_version(); - $retval .= "<BR>\n". $this->create_log_categories_and_classes(); - $retval .= "<BR>\n". $this->create_attributes(); - $retval .= "<BR>\n". $this->create_anonymous_contact_data(); - $retval .= "<BR>\n". $this->create_status_records(); - $retval .= "<BR>\n". $this->create_tag_names(); - $retval .= "<BR>\n". $this->build_preferences(); - $retval .= "<BR>\n". $this->create_users(); - $retval .= "<BR>\n". $this->create_user_group_records(); - - $commitRes = $this->db->commitTrans(); - if($commitRes == 1) { - $retval .= "<BR>\n ----------- Created (". $this->totalRecords ."), result of commit: (". $commitRes .")."; - store_setup_data(3, 1, 'result'); - store_setup_data(4, 1, 'accessible'); - } - else { - $this->db->rollbackTrans(); - store_setup_data(3, 0, 'result'); - throw new exception(__METHOD__ .": failed to commit the transaction (". $commitRes .")"); - } - - } - catch(exception $e) { - //TODO: rollback the transaction - $retval = "An error occurred: ". $e->getMessage(); - } - - return($retval); - - }//end go() - //========================================================================= - - - - //========================================================================= - /** - * Set version information into the database for future upgradeability. - */ - private function set_version() { - //get the version string. - $fullVersionString = read_version_file(); - - $suffixData = explode('-', $fullVersionString); - if(count($suffixData) == 2 && preg_match('/\./', $suffixData[0]) && !preg_match('/\./', $suffixData[1])) { - //there's a suffix, and it doesn't contain periods (i.e. "1.0.0-ALPHA1") - $suffix = $suffixData[1]; - } - elseif(count($suffixData) == 1) { - //no suffix. - $suffix = ""; - } - else { - //there's a dash in the name, but it's invalid or contains periods (i.e. "BETA-1.0.0" or "1.0.0-ALPHA1.0") - throw new exception(__METHOD__ .": version string is invalid (". $fullVersionString ."), suffix contains dashes, or there is a prefix"); - } - - //remove the suffix & parse it. - $versionString = $suffixData[0]; - $versionData = $this->parse_version_string($fullVersionString); - $sqlData = $versionData; - - - #$sqlData = array( - # 'version_string' => $fullVersionString, - # 'version_major' => $versionData[0], - # 'version_minor' => $versionData[1], - # 'version_maintenance' => $versionData[2], - # 'version_suffix' => $suffix - #); - - $retval = 0; - foreach($sqlData as $name => $value) { - $sql = "SELECT internal_data_set_value('". $name ."', '". $value ."')"; - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - $retval++; - $this->totalRecords++; - } - else { - throw new exception(__METHOD__ .": failed to set (". $name .") as (". $value .")::: ". $dberror); - } - } - - if($retval == count($sqlData)) { - //okay, the final test: run a query that straps everything together, to ensure it all has the same version. - $sql = "SELECT internal_data_get_value('version_major') || '.' || internal_data_get_value('version_minor') " . - " || '.' || internal_data_get_value('version_maintenance') as text, " . - "internal_data_get_value('version_suffix') as version_suffix;"; - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - $data = $this->db->farray(); - $dbVersionString = $data['text']; - if(strlen($data['version_suffix'])) { - $dbVersionString .= "-". $data['version_suffix']; - } - - if($dbVersionString === $fullVersionString) { - //okay, one final test: check that the "version_string" in the database matches ours. - $sql = "SELECT internal_data_get_value('version_string')"; - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - $data = $this->db->farray(); - $dbVersionString = $data[0]; - - if($dbVersionString === $fullVersionString) { - $this->data['version_string'] = $fullVersionString; - $retval = "Successfully set version string"; - } - else { - throw new exception(__METHOD__ .": derived database version string (". $dbVersionString .") doesn't match our version (". $fullVersionString .")"); - } - } - else { - throw new exception(__METHOD__ .": failed to retrieve full version_string from database::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - else { - throw new exception(__METHOD__ .": derived database version string (". $dbVersionString .") doesn't match our version (". $fullVersionString .")"); - } - } - else { - throw new exception(__METHOD__ .": failed to retrieve derived database version string::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - else { - //it's cryptic, but what should it really say??? - throw new exception(__METHOD__ .": internal error, checksum didn't match"); - } - - return($retval); - - }//end set_version() - //========================================================================= - - - - //========================================================================= - private function create_log_categories_and_classes() { - - $counter = 0; - - $classes = array( - 1 => 'Error', - 2 => 'Information', - 3 => 'Create', - 4 => 'Update', - 5 => 'Delete', - 6 => 'REPORT', - 7 => 'DEBUG' - ); - - - foreach($classes as $num=>$name) { - $insertArr = array( - 'log_class_id' => $num, - 'name' => $name - ); - $sql = "INSERT INTO log_class_table ". $this->gfObj->string_from_array($insertArr, 'insert', NULL, 'sql'); - - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - //good. - $counter++; - $this->totalRecords++; - } - else { - throw new exception(__METHOD__ .": failed to create class record for (". $name .")::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - - - //Reset sequence, so new records can be created. - $sql = "SELECT setval('log_class_table_log_class_id_seq', (SELECT max(log_class_id) FROM log_class_table))"; - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - $categories = array( - 1 => 'Database', - 2 => 'Authentication', - 3 => 'Users', - 4 => 'General', - 5 => 'Project', - 6 => 'Helpdesk', - 7 => 'Task', - 8 => 'Tags', - 9 => 'Estimates', - 10 => 'Navigation', - 11 => 'Preferences' - ); - - - foreach($categories as $num=>$name) { - $insertArr = array( - 'log_category_id' => $num, - 'name' => $name - ); - $sql = "INSERT INTO log_category_table ". $this->gfObj->string_from_array($insertArr, 'insert', NULL, 'sql'); - - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - //good. - $counter++; - $this->totalRecords++; - } - else { - throw new exception(__METHOD__ .": failed to create category record for (". $name .")::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - - //Reset sequence, so new records can be created. - $sql = "SELECT setval('log_category_table_log_category_id_seq', (SELECT max(log_category_id) FROM log_category_table))"; - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - - //format (primary index is log_event_id): log_class_id, log_category_id, description - $logEvents = array( - // * log_event_id | log_class_id | log_category_id | description - 1 => array(3, 5, 'Project: created record'), - 2 => array(5, 5, 'Project: deleted record'), - 3 => array(4, 5, 'Project: updated record'), - 4 => array(1, 5, 'Project: ERROR'), - 5 => array(3, 6, 'Helpdesk: Created record'), - 6 => array(4, 6, 'Helpdesk: Updated record'), - 7 => array(2, 6, 'Helpdesk: Information'), - 8 => array(1, 6, 'Helpdesk: ERROR'), - 9 => array(6, 6, 'Helpdesk: Report'), - 10 => array(3, 7, 'Task: created record'), - 11 => array(5, 7, 'Task: deleted record'), - 12 => array(4, 7, 'Task: updated record'), - 13 => array(1, 1, 'Database Error'), - 14 => array(6, 5, 'Project: Activity Report'), - 15 => array(6, 7, 'Task: Activity Report'), - 16 => array(3, 2, 'User logged-in'), - 17 => array(5, 2, 'User logged-out'), - 18 => array(6, 2, 'Login/Logout Report'), - 19 => array(3, 8, 'Tags: created record'), - 20 => array(5, 8, 'Tags: deleted record'), - 21 => array(4, 8, 'Tags: updated record'), - 22 => array(6, 8, 'Tags: Activity Report'), - 23 => array(1, 2, 'Authentication: ERROR'), - 24 => array(2, 10, 'Navigation: Viewed page'), - 25 => array(4, 9, 'Update: Estimates'), - 26 => array(1, 9, 'Error: Estimates'), - 27 => array(2, 5, 'Information: Project'), - 28 => array(4, 3, 'Update: Users'), - 29 => array(1, 7, 'Error: Task'), - 30 => array(3, 3, 'Create: Users') - ); - - foreach($logEvents as $logEventId => $subArr) { - $insertArr = array( - 'log_event_id' => $logEventId, - 'log_class_id' => $subArr[0], - 'log_category_id' => $subArr[1], - 'description' => $subArr[2] - ); - $sql = "INSERT INTO log_event_table ". $this->gfObj->string_from_array($insertArr, 'insert', NULL, 'sql'); - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - $counter++; - $this->totalRecords++; - } - else { - throw new exception(__METHOD__ .": failed to create log_event_id #". $insertArr['log_event_id'] - .", description: ". $insertArr['description'] ."<BR>\nERROR::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - - //FINAL SANITY CHECKS!!! - if($counter == (count($classes) + count($categories) + count($logEvents))) { - - //reset the sequence. - $sql = "SELECT setval('log_event_table_log_event_id_seq', (SELECT max(log_event_id) FROM log_event_table))"; - if($this->run_sql($sql) === TRUE) { - $retval = "Successfully created all category, class, and log event records (". $counter .")"; - } - else { - throw new exception(__METHOD__ .": failed to reset sequence for log_event table::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - else { - throw new exception(__METHOD__ .": Internal error, failed to create all category and class records"); - } - } - else { - throw new exception(__METHOD__ .": failed to reset sequence for log_category_table::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - else { - throw new exception(__METHOD__ .": failed to reset sequence for log_class_table::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - - return($retval); - - }//end create_log_categories_and_classes() - //========================================================================= - - - - //========================================================================= - private function create_attributes() { - $attributes = array( - 3 => array('phone', 'phone', 'Phone'), - 4 => array('fax', 'phone', 'Fax'), - 5 => array('cell', 'phone', 'Cell'), - 6 => array('im_yahoo', 'alphanumeric', 'IM: Yahoo'), - 7 => array('im_skype', 'alphanumeric', 'IM: Skype'), - 8 => array('im_aol', 'alphanumeric', 'IM: AOL'), - 9 => array('im_msn', 'alphanumeric', 'IM: MSN'), - 10 => array('im_icq', 'alphanumeric', 'IM: ICQ'), - 11 => array('address', 'sql', 'Address'), - 12 => array('city', 'alphanumeric', 'City'), - 13 => array('state', 'alphanumeric', 'State'), - 14 => array('zip', 'alphanumeric', 'Zip') - ); - - $retval = 0; - foreach($attributes as $attributeId => $subData) { - $insertArr = array( - 'attribute_id' => $attributeId, - 'name' => $subData[0], - 'clean_as' => $subData[1], - 'display_name' => $subData[2] - ); - $sql = "INSERT INTO attribute_table ". $this->gfObj->string_from_array($insertArr, 'insert', NULL, 'sql'); - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - $retval++; - $this->totalRecords++; - } - else { - throw new exception(__METHOD__ .": failed to insert data for attribute (". $insertArr['name'] .")::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - - if($retval == count($attributes)) { - $sql = "SELECT setval('attribute_table_attribute_id_seq'::text, (SELECT max(attribute_id) FROM attribute_table))"; - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - $retval = "Successfully created all attributes (". $retval .")!"; - } - else { - throw new exception(__METHOD__ .": failed to reset sequence::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - else { - throw new exception(__METHOD__ .": internal error (sanity check failed)"); - } - - return($retval); - }//end create_attributes() - //========================================================================= - - - - //========================================================================= - /** - * Create the anonymous user. This includes their contact data and the - * default group. - * - * TODO: change "short_name" into "display_name". - */ - private function create_anonymous_contact_data() { - $allRecords = array( - 'disabled group' => array( - 'name' => 'group_table', - 'data' => array( - 'group_id' => 0, - 'name' => 'disabled', - 'short_name' => 'DISABLED', - 'leader_uid' => 0 - ), - ), - 'anonymous record in user table' => array( - 'name' => 'user_table', - 'data' => array( - 'uid' => 0, - 'username' => 'Anonymous', - 'password' => 'disabled', //this is PURPOSELY an invalid password (passwords should be 32-char md5's - 'is_admin' => 'f', - 'is_active' => 'f', - 'group_id' => 0, - 'contact_id' => 0 - ), - ), - 'default group' => array( - 'name' => 'group_table', - 'data' => array( - 'group_id' => 1, - 'name' => 'default', - 'short_name' => '-DEFAULT-', - 'leader_uid' => 0 - ), - ), - 'anonymous contact record' => array( - 'name' => 'contact_table', - 'data' => array( - 'contact_id' => 0, - 'company' => '', - 'fname' => 'Anonymous', - 'lname' => '', - 'contact_email_id' => '-1' - ) - ), - 'anonymous email record' => array( - 'name' => 'contact_email_table', - 'data' => array( - 'contact_id' => 0, - 'email' => 'ano...@nu...' - ) - ) - ); - - $retval = 0; - foreach($allRecords as $operationName => $subData) { - $tableName = $subData['name']; - $insertArr = $subData['data']; - - $sql = "INSERT INTO ". $tableName ." ". $this->gfObj->string_from_array($insertArr, 'insert', NULL, 'sql'); - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - $this->totalRecords++; - $retval++; - } else { - throw new exception(__METHOD__. ": failed perform operation (". $operationName .") for table (". $tableName .")::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - - $sql = "SELECT currval('contact_email_table_contact_email_id_seq'::text)"; - if($this->run_sql($sql)) { - $data = $this->db->farray(); - $sql = "UPDATE contact_table SET contact_email_id=". $data[0] ." WHERE contact_id=0"; - if($this->run_sql($sql)) { - $this->totalRecords++; - } - else { - throw new exception(__METHOD__ .": failed to set contact_email_id for anonymous"); - } - } - else { - throw new exception(__METHOD__ .": failed to get sequence for contact_email_table"); - } - - if($retval == count($allRecords)) { - //reset the sequence for the group table... - $sql = "SELECT setval('group_table_group_id_seq'::text, (SELECT max(group_id) FROM group_table))"; - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - //good to go. - $retval = "Successfully created anonymous user, anonymous contact record, and the two default groups (". $retval .")!"; - } - else { - throw new exception(__METHOD__ .": failed to reset group sequence::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - else { - throw new exception(__METHOD__ .": internal error (failed sanity check)"); - } - - return($retval); - }//end create_anonymous_contact_data() - //========================================================================= - - - //========================================================================= - private function create_status_records() { - //format: {status_id} => array({name}, {description}) - $statuses = array( - 0 => array('New/Offered', 'New record'), - 1 => array('Pending', 'Not new: pending review, or nearly complete.'), - 2 => array('Running/Accepted', 'Work is underway'), - 3 => array('Stalled', 'Unable to complete, or dependent on other things.'), - 4 => array('Ended/Solved', 'Work is complete!'), - 5 => array('Rejected', 'Denied.'), - 6 => array('Re-opened', 'Was solved, but is once again open.'), - ); - - $retval = 0; - foreach($statuses as $statusId => $subData) { - $insertArr = array( - 'status_id' => $statusId, - 'name' => $subData[0], - 'description' => $subData[1] - ); - $sql = "INSERT INTO status_table ". $this->gfObj->string_from_array($insertArr, 'insert', NULL, 'sql'); - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - $retval++; - $this->totalRecords++; - } - else { - throw new exception(__METHOD__ .": failed to create status (". $insertArr['name'] .")::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - - if($retval == count($statuses)) { - //reset the status_table.status_id sequence... - $sql = "SELECT setval('status_table_status_id_seq'::text, (SELECT max(status_id) FROM status_table))"; - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - //good to go. - $retval = "Successfully created all status records (". $retval .")!"; - } - else { - throw new exception(__METHOD__ .": failed to reset status sequence::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - else { - throw new exception(__METHOD__ .": internal error (failed sanity check)"); - } - - return($retval); - - }//end create_status_records() - //========================================================================= - - - - //========================================================================= - private function create_tag_names() { - $tags = array( - 1 => 'bug', - 2 => 'feature request', - 3 => 'information', - 4 => 'network related', - 5 => 'critical', - 6 => 'exception' - ); - - $retval = 0; - foreach($tags as $id=>$name) { - $insertArr = array( - 'tag_name_id' => $id, - 'name' => $name - ); - $sql = "INSERT INTO tag_name_table ". $this->gfObj->string_from_array($insertArr, 'insert', NULL, 'sql'); - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - $retval++; - $this->totalRecords++; - } - else { - throw new exception(__METHOD__ .": failed to insert data for (". $name .")::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - - if($retval == count($tags)) { - //reset sequence for tag_name_table.tag_name_id - $sql = "SELECT setval('tag_name_table_tag_name_id_seq'::text, (SELECT max(tag_name_id) FROM tag_name_table))"; - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - //good to go. - $retval = "Successfully created all tags (". $retval .")!"; - } - else { - throw new exception(__METHOD__ .": failed to reset tag_name sequence::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - else { - throw new exception(__METHOD__ .": internal error (sanity check failed)"); - } - - return($retval); - }//end create_tag_names() - //========================================================================= - - - - //========================================================================= - private function build_preferences() { - //format: {pref_type_id} => array({name}, {default_value}, {display_name}, {description}) - $prefTypes = array( - 1 => array('startModule', 'helpdesk', 'Starting on Module', 'Defines which section will be loaded upon login if nothing was selected.'), - 5 => array('sorting_helpdesk', 'public_id|DESC', 'Helpdesk Sorting', 'Define the type of sorting for the helpdesk page.'), - 6 => array('sorting_project', 'priority|ASC', 'Project Sorting', 'Define the type of sorting for the helpdesk page.'), - 7 => array('projectDetails_taskDisplayOnlyMine', 'all', 'Project Details: Task display', 'Define what tasks are displayed on a project\\\'s details page.'), - 8 => array('projectDetails_showCompletedIssues', '1', 'Project Details: Display completed issues', 'Should completed issues display in the details of a project?') - ); - - $retval = 0; - foreach($prefTypes as $prefTypeId => $subData) { - $insertArr = array( - 'pref_type_id' => $prefTypeId, - 'name' => $subData[0], - 'default_value' => $subData[1], - 'display_name' => $subData[2], - 'description' => $subData[3] - ); - - $sql = "INSERT INTO pref_type_table ". $this->gfObj->string_from_array($insertArr, 'insert', NULL, 'sql_insert'); - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - $retval++; - $this->totalRecords++; - } - else { - throw new exception(__METHOD__ .": failed to insert data for (". $insertArr['name'] .")::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - - if($retval == count($prefTypes)) { - //format: {pref_option_id} => array({pref_type_id}, {name}, {effective_value}) - $prefOptions = array( - 1 =>array(1, 'Helpdesk', 'helpdesk'), - 2 =>array(1, 'Projects', 'project'), - 3 =>array(1, 'Summary ', 'summary'), - 8 =>array(5, 'ID - Descending', 'public_id|DESC'), - 9 =>array(5, 'ID - Ascending', 'public_id|ASC'), - 10 =>array(5, 'Priority - Descending', 'priority|DESC'), - 11 =>array(5, 'Priority - Ascending', 'priority|ASC'), - 12 =>array(5, 'Submit - Descending', 'start_date|DESC'), - 13 =>array(5, 'Submit - Ascending', 'start_date|ASC'), - 14 =>array(5, 'Title - Descending', 'name|DESC'), - 15 =>array(5, 'Title - Ascending', 'name|DESC'), - 16 =>array(5, 'Status ID - Descending', 'status_id|DESC'), - 17 =>array(5, 'Status ID - Ascending', 'status_id|DESC'), - 18 =>array(5, 'Assigned - Descending', 'assigned|DESC'), - 19 =>array(5, 'Assigned - Ascending', 'assigned|DESC'), - 20 =>array(6, 'Priority - Ascending', 'priority|ASC'), - 21 =>array(6, 'Priority - Descending', 'priority|DESC'), - 22 =>array(6, 'Name of Project - Ascending', 'name|ASC'), - 23 =>array(6, 'Name of Project - Descending', 'name|DESC'), - 24 =>array(6, 'Begin - Ascending', 'start_date|ASC'), - 25 =>array(6, 'Begin - Descending', 'start_date|DESC'), - 26 =>array(6, 'End - Ascending', 'end|ASC'), - 27 =>array(6, 'End - Descending', 'end|DESC'), - 28 =>array(6, 'Status ID - Ascending', 'status_id|ASC'), - 29 =>array(6, 'Status ID - Descending', 'status_id|DESC'), - 30 =>array(6, 'Progress - Ascending', 'progress|ASC'), - 31 =>array(6, 'Progress - Descending', 'progress|DESC'), - 32 =>array(6, 'Leader - Ascending', 'leader_contact_id|ASC'), - 33 =>array(6, 'Leader - Descending', 'leader_contact_id|DESC'), - 34 =>array(7, 'Show everything', 'all'), - 35 =>array(7, 'All of mine (created & assigned)', 'mine'), - 36 =>array(7, 'Only my assigned items', 'assigned'), - 37 =>array(8, 'Yes', '1'), - 38 =>array(8, 'No', '0'), - ); - - foreach($prefOptions as $prefOptionId => $subData) { - $insertArr = array( - 'pref_option_id' => $prefOptionId, - 'pref_type_id' => $subData[0], - 'name' => $subData[1], - 'effective_value' => $subData[2] - ); - $sql = "INSERT INTO pref_option_table ". $this->gfObj->string_from_array($insertArr, 'insert', NULL, 'sql'); - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - $retval++; - $this->totalRecords++; - } - else { - throw new exception(__METHOD__ .": failed to insert data for pref option (". $insertArr['name'] .")::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - - if($retval == (count($prefTypes) + count($prefOptions))) { - //reset the pref_type_table.pref_type_id sequence. - $sql = "SELECT setval('pref_type_table_pref_type_id_seq'::text, (SELECT max(pref_type_id) FROM pref_type_table))"; - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - if($retval == (count($prefTypes) + count($prefOptions))) { - //reset the pref_option_table.pref_option_id sequence. - $sql = "SELECT setval('pref_option_table_pref_option_id_seq'::text, (SELECT max(pref_option_id) FROM pref_option_table))"; - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - $retval = "Successfully created all preferences and options (". $retval .")!"; - } - else { - throw new exception(__METHOD__ .": failed to reset the pref_option sequence::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - else { - throw new exception(__METHOD__ .": internal error (sanity check #2 failed)"); - } - } - else { - throw new exception(__METHOD__ .": failed to reset pref_type sequence::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - else { - throw new exception(__METHOD__ .": internal error (sanity check #2 failed): (". $retval ." != ". (count($prefTypes) + count($prefOptions)) .")"); - } - } - else { - throw new exception(__METHOD__ .": internal error (sanity check #1 failed)"); - } - - return($retval); - - }//end build_preferences() - //========================================================================= - - - - //========================================================================= - private function create_users() { - - //retrieve the user information. - $userData = get_setup_data(3, 'post_info'); - if(!is_array($userData) || count($userData) != 2) { - throw new exception(__METHOD__ .": no user data...?". $this->gfObj->debug_print($userData,0)); - } - - $counter = 0; - $retval = "Successfully created records for::: "; - foreach($userData as $num => $subData) { - - //split their name up, based upon spaces. - $nameData = explode(' ', $subData['name']); - $insertArr = array(); - if(count($nameData) == 1) { - $insertArr['fname'] = $nameData[0]; - $insertArr['lname'] = ""; - } - elseif(count($nameData) == 2) { - $insertArr['fname'] = $nameData[0]; - $insertArr['lname'] = $nameData[1]; - } - else { - $insertArr['fname'] = $nameData[0]; - $insertArr['lname'] = preg_replace('/^'. $insertArr['fname'] .' /', '', $subData['name']); - } - $insertArr['contact_email_id'] = '-1'; - - //create their contact record. - $sql = "INSERT INTO contact_table ". $this->gfObj->string_from_array($insertArr, 'insert', NULL, 'sql'); - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - - if(!strlen($dberror) && $numrows == 1) { - $sql = "SELECT currval('contact_table_contact_id_seq'::text)"; - if($this->run_sql($sql, 1) === TRUE) { - $this->totalRecords++; - - $data = $this->db->farray(); - $contactId = $data[0]; - - //now create the user. - $xUser = $subData['username']; - $insertArr = array( - 'username' => $subData['username'], - 'password' => md5($subData['password'] .'_'. $contactId), - 'is_admin' => interpret_bool($subData['is_admin'], array('f', 't')), - 'contact_id' => $contactId - ); - $sql = "INSERT INTO user_table ". $this->gfObj->string_from_array($insertArr, 'insert', NULL, 'sql'); - - if($this->run_sql($sql, 1) === TRUE) { - $sql = "SELECT currval('user_table_uid_seq'::text)"; - if($this->run_sql($sql,1) === TRUE) { - $data = $this->db->farray(); - $lastUid = $data[0]; - - //create an email address for them. - $sql = "INSERT INTO contact_email_table (contact_id, email) VALUES (". $contactId .", '". strtolower($subData['email']) ."')"; - if($this->run_sql($sql,1) === TRUE) { - $counter++; - //get the newly inserted id, so we can update the contact table. - if($this->run_sql("SELECT currval('contact_email_table_contact_email_id_seq'::text)")) { - $data = $this->db->farray(); - $contactEmailId = $data[0]; - - $sql = "UPDATE contact_table SET contact_email_id=". $contactEmailId ." WHERE contact_id=". $contactId; - if($this->run_sql($sql)) { - $retval = $this->gfObj->create_list($retval, " --- Created record for ". $subData['username'] ." (". $lastUid .")", "<BR>\n"); - } - else { - throw new exception(__METHOD__ .": unable to update contact table with new contact_email_id..."); - } - } - else { - throw new exception(__METHOD__ .": failed to retrieve contact_email_id"); - } - } - else { - throw new exception(__METHOD__ .": failed to create email for ". $subData['username'] ."::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - else { - throw new exception(__METHOD__ .": failed to retrieve uid for ". $subData['username'] ."::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - else { - throw new exception(__METHOD__ .": failed to create user record for ". $subData['username'] ."::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - else { - throw new exception(__METHOD__ .": unable to retrieve contact_id for ". $subData['username'] ."::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - else { - throw new exception(__METHOD__ .": failed to create contact record for ". $subData['username'] ."::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - - if($counter == 2) { - $retval = $this->gfObj->create_list($retval, " --->>> done, created (". $counter .") records", "<BR>\n"); - } - else { - throw new exception(__METHOD__ .": failed to create users (". $counter .")::: ". $this->gfObj->debug_print($userData,0)); - } - - return($retval); - }//end create_users() - //========================================================================= - - - - //========================================================================= - public function finish(cs_genericPage &$page) { - - $stepRes = get_setup_data(3, 'result'); - if($stepRes == 1) { - $page->set_message_wrapper(array( - 'title' => "Successfully Setup Data", - 'message' => "All default data was stored in the new database successfully!", - 'type' => "status" - )); - store_setup_data(3, $this->data, 'data'); - $page->conditional_header("/setup/4", TRUE); - } - else { - $page->set_message_wrapper(array( - 'title' => "Step Failed", - 'message' => "Please review the errors below and proceed accordingly.", - 'type' => "error" - )); - $page->conditional_header("/setup/3", TRUE); - } - - }//end finish() - //========================================================================= - - - - //========================================================================= - protected function run_sql($sql, $expectedNumrows=NULL) { - if(strlen($sql)) { - $numrows = $this->db->exec($sql); - $dberror = $this->db->errorMsg(); - $this->lastNumrows = $numrows; - $this->lastDberror = $dberror; - - if(!strlen($dberror) && $numrows >= 0) { - if(is_numeric($expectedNumrows)) { - if($expectedNumrows == $numrows) { - $retval = TRUE; - } - else { - $retval = FALSE; - } - } - else { - //don't care if it's numeric. - $retval = TRUE; - } - } - else { - throw new exception(__METHOD__ .": failed to run SQL, got numrows=(". $numrows ."), dberror::: ". $dberror ."<BR>\nSQL::: ". $sql); - } - } - else { - throw new exception(__METHOD__ .": no SQL to run..."); - } - - return($retval); - }//end run_sql() - //========================================================================= - - - - //========================================================================= - private function create_user_group_records() { - $sql = "INSERT INTO user_group_table (uid, group_id) SELECT uid, group_id FROM user_table"; - if($this->run_sql($sql, 3) === TRUE) { - $retval = "Successfully created user_group linkage."; - } - else { - throw new exception(__METHOD__ .": unable to create user group records::: ". $this->lastDberror ."<BR>\nSQL::: ". $sql); - } - return($retval); - }//end create_user_group_records() - //========================================================================= - - -}//end __setupDefaultValues{} - - - -class _setupUpgrade extends upgrade { - - public function __construct(cs_phpDB $db) { - $this->db = $db; - parent::__construct(); - }//end __construct() - - public function finalize_conversion() { - $myVersion = parent::read_version_file(); - $setDataResult = parent::run_sql("SELECT internal_data_set_value('converted_from_version', '". parent::read_version_file() ."')"); - parent::update_num_users_to_convert(); - $retval = parent::update_database_version($myVersion); - debug_print(__METHOD__ .": myVersion=(". $myVersion ."), setDataResult=(". $setDataResult ."), retval=(". $retval .")"); - - return($myVersion); - }//end finalize_conversion() -}//end _setupUpgrade{} - ?> Modified: releases/1.2/includes/setup/5.inc =================================================================== --- releases/1.2/includes/setup/5.inc 2009-10-26 01:31:26 UTC (rev 994) +++ releases/1.2/includes/setup/5.inc 2009-10-26 03:11:30 UTC (rev 995) @@ -10,148 +10,76 @@ $writeConfigResult = $obj->write_config($page); $page->set_message_wrapper(array( - 'title' => "Reloaded... ", + 'title' => "Setup Complete", 'message' => $writeConfigResult, 'type' => "status", - 'linkURL' => '/login' + 'linkText' => "Proceed To Login", + 'linkURL' => '/setup/5?removeData=1' )); $page->conditional_header("/setup/5", TRUE); } +elseif($_GET['removeData'] == 1) { + unset($_SESSION['setup']); + $page->conditional_header('/login.php'); +} else { if(get_setup_data(5, 'result')) { $page->clear_content(); - #$page->set_block_row('content', 'submitButton'); $test = &new TestSuite("All Tests"); - $test->addTestFile(dirname(__FILE__) .'/../../lib/_unitTests_/cs-content_tests.php'); - #$test->addTestFile(dirname(__FILE__) .'/../../lib/_unitTests_/cs-arrayToPath_tests.php'); - #$test->addTestFile(dirname(__FILE__) .'/../../lib/_unitTests_/cs-phpxml_tests.php'); + $test->addTestFile(dirname(__FILE__) .'/../../lib/cs-content/tests/testOfCSContent.php'); + $test->addTestFile(dirname(__FILE__) .'/../../lib/cs-content/tests/testOfCSFileSystem.php'); + $test->addTestFile(dirname(__FILE__) .'/../../lib/cs-content/tests/testOfCSGlobalFunctions.php'); + $test->addTestFile(dirname(__FILE__) .'/../../lib/cs-content/tests/testOfCSVersionAbstract.php'); + $test->addTestFile(dirname(__FILE__) .'/../../lib/cs-phpxml/tests/testOfA2P.php'); + $test->addTestFile(dirname(__FILE__) .'/../../lib/cs-phpxml/tests/testOfCSPHPXML.php'); + $test->addTestFile(dirname(__FILE__) .'/../../lib/cs-webapplibs/tests/testOfCSWebAppLibs.php'); $display = new HtmlReporter(); $test->run($display); $page->gfObj->debug_print("Passes: (". $display->getPassCount() .")"); - } - else { + $page->gfObj->debug_print("Fails: (". $display->getFailCount() .")"); - } -} - - -class __finalStep { - - - private $page; - private $gfObj; - - - //========================================================================= - public function __construct(cs_genericPage $page, array $stepData) { - $this->page = $page; - $this->stepData = $stepData; - unset($this->stepData[5]); + //log our result into the database. + $db = new cs_phpDB; + $db->connect(get_config_db_params()); - $this->gfObj = new cs_globalFunctions; - $this->fsObj = new cs_fileSystemClass(dirname(__FILE__) ."/../../". CONFIG_DIRECTORY); - }//end __construct() - //========================================================================= - - - - //========================================================================= - function write_config() { - if($this->fsObj->is_writable(NULL)) { - $lsData = $this->fsObj->ls(); - if(!is_array($lsData[CONFIG_FILENAME])) { - $myData = array(); - foreach($this->stepData as $stepNum=>$garbage) { - $tempStepData = get_setup_data($stepNum, 'data'); - if(is_array($tempStepData)) { - $myData = array_merge($tempStepData, $myData); - } - else { - throw new exception(__METHOD__ .": step #". $stepNum ." has no valid data... ". $this->gfObj->debug_print($tempStepData,0)); - } - } - - //now that we've built the array successfully, now let's turn it into XML. - $xmlCreator = new xmlCreator('config'); - foreach($myData as $index=>$value) { - $xmlCreator->add_tag($index, $value); - } - $extraAttributes = array( - 'generated' => date('Y-m-d H:m:s'), - 'version' => $myData['version_string'] - ); - $xmlCreator->add_attribute('/config', $extraAttributes); - - //now, create an XML string... - $xmlString = $xmlCreator->create_xml_string(); - - $this->fsObj->create_file(CONFIG_FILENAME, TRUE); - $writeRes = $this->fsObj->write($xmlString, CONFIG_FILENAME); - - if($writeRes > 0) { - $retval = "Successfully created the XML config file"; - store_setup_data(5, 1, 'result'); - store_setup_data(5, $retval, 'text'); - } - else { - throw new exception(__METHOD__ .": failed to write any data to the config file"); - } + $log = new logsClass($db, 'SETUP'); + $log->log_by_class('UNIT TEST DATA::: passes='. $display->getPassCount() .', fails='. $display->getFailCount() .', exceptions='. $display->getExceptionCount(), 'Information'); + + $title = "Setup Complete"; + $issueLink = '<a href="http://project.crazedsanity.com/extern/helpdesk/create?from='. $page->get_version() . + '&version='. $page->get_version() .'&isdevsite='. constant('ISDEVSITE') .'CS-Project Helpdesk</a>'; + if($display->getPassCount() > 0) { + $type = 'status'; + $message = "Setup has been completed successfully. If you would like to remove setup data and proceed to login, click the link below."; + if($display->getFailCount() > 0 && $display->getPassCount() > 0) { + $type = 'warning'; + $message = "Setup completed, but there seem to be errors (see above). You may be able to ignore them, especially " . + "if you are running a test site. Please report them at ". $issueLink; } - else { - throw new exception(__METHOD__ .": ". CONFIG_FILE_LOCATION ." already exists!"); + elseif($display->getPassCount() == 0) { + $title = "TOTAL FAILURE :("; + $type = 'fatal'; + $message = "Setup finished, but it appears all the tests failed. Your installation will likely be " . + "highly unstable, if it is useable at all. Please report the problem to ". $issueLink .", along with " . + "information regarding your server's environment, database, the exception information, and anything " . + "else that could help track the problem down."; } } else { - throw new exception(__METHOD__ .": the config directory is not writable!"); + } - $configObj = new config(CONFIG_FILE_LOCATION); - $configObj->remove_setup_config(); - - return($retval); - }//end write_config() - //========================================================================= -} - - -//####################################################################################### -/** - * Built to avoid always printing-out the results (so we can retrieve result data separately. - */ -class MyDisplay extends SimpleReporter { - - function paintHeader($test_name) { - } - - function paintFooter($test_name) { - } - - function paintStart($test_name, $size) { - parent::paintStart($test_name, $size); - } - - function paintEnd($test_name, $size) { - parent::paintEnd($test_name, $size); - } - - function paintPass($message) { - parent::paintPass($message); - } - - function paintFail($message) { - parent::paintFail($message); - } -} -//####################################################################################### - - -class unitTest extends UnitTestCase { - - function testOfTester () { - $this->assertTrue(FALSE); + $page->set_message_wrapper(array( + 'title' => $title, + 'message' => $message, + 'type' => $type, + 'linkText' => "Proceed to Login", + 'linkURL' => "/setup/5?removeData=1" + )); } } + ?> Modified: releases/1.2/includes/setup.inc =================================================================== --- releases/1.2/includes/setup.inc 2009-10-26 01:31:26 UTC (rev 994) +++ releases/1.2/includes/setup.inc 2009-10-26 03:11:30 UTC (rev 995) @@ -22,7 +22,7 @@ $configObj = new config(NULL, FALSE); $configData = $configObj->read_config_fi... [truncated message content] |
From: <cra...@us...> - 2009-10-26 01:31:33
|
Revision: 994 http://cs-project.svn.sourceforge.net/cs-project/?rev=994&view=rev Author: crazedsanity Date: 2009-10-26 01:31:26 +0000 (Mon, 26 Oct 2009) Log Message: ----------- Add default recaptcha keys to config. Modified Paths: -------------- trunk/1.2/lib/_setup/__finalStep.class.php Modified: trunk/1.2/lib/_setup/__finalStep.class.php =================================================================== --- trunk/1.2/lib/_setup/__finalStep.class.php 2009-10-26 01:29:53 UTC (rev 993) +++ trunk/1.2/lib/_setup/__finalStep.class.php 2009-10-26 01:31:26 UTC (rev 994) @@ -57,16 +57,18 @@ //Special values (including vars that cs_siteConfig{} handles) $specialValues = array( - 'site_root' => '{_DIRNAMEOFFILE_}/..', - 'document_root' => '{MAIN/SITE_ROOT}', - 'libdir' => '{MAIN/SITE_ROOT}/lib', - 'tmpldir' => '{MAIN/SITE_ROOT}/templates', - 'seq_helpdesk' => 'special__helpdesk_public_id_seq', - 'seq_project' => 'special__project_public_id_seq', - 'seq_main' => 'record_table_record_id_seq', - 'table_todocomment' => 'task_comment_table', - 'rwdir' => '{MAIN/SITE_ROOT}/rw', - 'format_wordwrap' => '90' + 'site_root' => '{_DIRNAMEOFFILE_}/..', + 'document_root' => '{MAIN/SITE_ROOT}', + 'libdir' => '{MAIN/SITE_ROOT}/lib', + 'tmpldir' => '{MAIN/SITE_ROOT}/templates', + 'seq_helpdesk' => 'special__helpdesk_public_id_seq', + 'seq_project' => 'special__project_public_id_seq', + 'seq_main' => 'record_table_record_id_seq', + 'table_todocomment' => 'task_comment_table', + 'rwdir' => '{MAIN/SITE_ROOT}/rw', + 'format_wordwrap' => '90', + 'recaptcha_publickey' => '6Ld27ggAAAAAADHN-jYSdY0cJjfM10pjRgbWS02B', + 'recaptcha_privatekey' => '6Ld27ggAAAAAAErK12LU6sCeYF8m-whCJn4azM2B' ); $defineAsGlobal=array('site_root', 'libdir', 'tmpldir'); foreach($specialValues as $index=>$value) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cra...@us...> - 2009-10-26 01:30:03
|
Revision: 993 http://cs-project.svn.sourceforge.net/cs-project/?rev=993&view=rev Author: crazedsanity Date: 2009-10-26 01:29:53 +0000 (Mon, 26 Oct 2009) Log Message: ----------- Fix a broken call to log information. Modified Paths: -------------- trunk/1.2/lib/mainRecordClass.php Modified: trunk/1.2/lib/mainRecordClass.php =================================================================== --- trunk/1.2/lib/mainRecordClass.php 2009-10-25 18:37:02 UTC (rev 992) +++ trunk/1.2/lib/mainRecordClass.php 2009-10-26 01:29:53 UTC (rev 993) @@ -375,7 +375,7 @@ debug_print($sqlArr); debug_print($definitionArr); $details = __METHOD__ .": no data left for (". $type .")!"; - $this->log_by_class($details, 'error'); + $this->logsObj->log_by_class($details, 'error'); throw new exception($details); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cra...@us...> - 2009-10-25 18:37:08
|
Revision: 992 http://cs-project.svn.sourceforge.net/cs-project/?rev=992&view=rev Author: crazedsanity Date: 2009-10-25 18:37:02 +0000 (Sun, 25 Oct 2009) Log Message: ----------- Fix a pass-by-reference error, require captcha when using external interface. Fixes issue #304 ("Spam Blocking Measures") /includes/extern.inc: * don't pass $db by reference (causes an error) /includes/extern/helpdesk.inc: * store POSTed remark in the session in case they failed the captcha. * give a special error if they failed the captcha * remove the stored data if they passed the captcha. * put POSTed remark back on the page as a template var.. /includes/extern/shared.inc [NEW]: * handles the captcha stuff /lib/recaptchalib.php [NEW]: * library for the captcha stuff. /templates/header.shared.tmpl: * add "SCRIPT_EXTRA" var for extra scripts. /templates/extern/helpdesk/SCRIPT_EXTRA.shared.tmpl [NEW]: * sets some javascript stuff so the captcha displays the simple version. /templates/extern/helpdesk/view.content.tmpl: * add placeholder for captcha & a template var for stored remark. Modified Paths: -------------- trunk/1.2/includes/extern/helpdesk.inc trunk/1.2/includes/extern.inc trunk/1.2/templates/extern/helpdesk/view.content.tmpl trunk/1.2/templates/header.shared.tmpl Added Paths: ----------- trunk/1.2/includes/extern/shared.inc trunk/1.2/lib/recaptchalib.php trunk/1.2/templates/extern/helpdesk/SCRIPT_EXTRA.shared.tmpl Modified: trunk/1.2/includes/extern/helpdesk.inc =================================================================== --- trunk/1.2/includes/extern/helpdesk.inc 2009-09-21 14:53:33 UTC (rev 991) +++ trunk/1.2/includes/extern/helpdesk.inc 2009-10-25 18:37:02 UTC (rev 992) @@ -19,6 +19,9 @@ if($postAction == "remark") { $helpdeskId = $_POST['ID']; + $_SESSION['POST_remark'] = $_POST['remark']; + + if($captchaResult === true) { if(is_numeric($helpdeskId)) { //now check to make sure they can actually remark on it... $helpdeskData = $proj->helpdeskObj->get_record($helpdeskId); @@ -45,6 +48,7 @@ "message" => "Your remark has been added to the database. Thank you for your feedback.", "type" => "status" )); + unset($_SESSION['POST_remark']); } else { set_message_wrapper(array( @@ -76,32 +80,17 @@ conditional_header("/extern/helpdesk/"); exit; } - } - elseif($_POST && strtolower($_POST['submit']) == "go" && !isset($_POST['action'])) { - //they're CREATING an issue. - $result = $proj->helpdeskObj->create_record($_POST['data']); - - //first, determine what happened from the result... - if($result > 0) { - //everything worked. - set_message_wrapper(array( - "title" => "Issue Successfully Created", - "message" => "Your issue has been added to the helpdesk. You should receive an email shortly with confirmation.", - "type" => "notice" - )); } else { - //something failed. + //didn't give me the proper captcha data... set_message_wrapper(array( - "title" => "Unable to Create Issue", - "message" => "Something broke. Sorry.", - "type" => "notice" + 'title' => "Captcha Failed", + 'message' => "You didn't answer the CAPTCHA correctly. Are you really a person?", + 'type' => "error" )); + conditional_header("/extern/helpdesk/view?ID=". $helpdeskId); + exit; } - - //send 'em packing. - conditional_header("/extern/helpdesk/view?ID=$result"); - exit; } elseif($_POST['action'] == "filter") { if($_POST['reset_filter']) { @@ -118,6 +107,7 @@ } } else { + $page->add_template_var('POST_remark', $_SESSION['POST_remark']); $action = $page->ftsSections[2]; $helpdeskId = $_GET['ID']; $page->add_template_var("id", $helpdeskId); Added: trunk/1.2/includes/extern/shared.inc =================================================================== --- trunk/1.2/includes/extern/shared.inc (rev 0) +++ trunk/1.2/includes/extern/shared.inc 2009-10-25 18:37:02 UTC (rev 992) @@ -0,0 +1,40 @@ +<?php +/* + * Created on Oct 23, 2009 + * + * SVN INFORMATION::: + * ------------------- + * Last Author::::::::: $Author$ + * Current Revision:::: $Revision$ + * Repository Location: $HeadURL$ + * Last Updated:::::::: $Date$ + */ + +require_once(constant('LIBDIR') .'/recaptchalib.php'); + +//TODO: put these into the site config and make 'em constants. +// Get a key from http://recaptcha.net/api/getkey + +$error = null; +$resp = null; + +$captchaResult = false; + +if($_POST && isset($_POST["recaptcha_challenge_field"])) { + $resp = recaptcha_check_answer (constant('RECAPTCHA_PRIVATEKEY'), + $_SERVER["REMOTE_ADDR"], + $_POST["recaptcha_challenge_field"], + $_POST["recaptcha_response_field"] + ); + if($resp->is_valid) { + $captchaResult = true; + } + else { + $error = $resp->error; + } +} + + +$page->add_template_var('captcha', recaptcha_get_html(constant('RECAPTCHA_PUBLICKEY'), $error)); + +?> Property changes on: trunk/1.2/includes/extern/shared.inc ___________________________________________________________________ Added: svn:keywords + Author Revision HeadURL Date Modified: trunk/1.2/includes/extern.inc =================================================================== --- trunk/1.2/includes/extern.inc 2009-09-21 14:53:33 UTC (rev 991) +++ trunk/1.2/includes/extern.inc 2009-10-25 18:37:02 UTC (rev 992) @@ -15,7 +15,7 @@ $db = new cs_phpDB; $db->connect(get_config_db_params()); -$page->db = &$db; +$page->db = $db; //The "sectionArr" is provided from contentSystem::finish() as a local var, and ftsSections is a leftover from fast_templating. $page->ftsSections = $sectionArr; Added: trunk/1.2/lib/recaptchalib.php =================================================================== --- trunk/1.2/lib/recaptchalib.php (rev 0) +++ trunk/1.2/lib/recaptchalib.php 2009-10-25 18:37:02 UTC (rev 992) @@ -0,0 +1,277 @@ +<?php +/* + * This is a PHP library that handles calling reCAPTCHA. + * - Documentation and latest version + * http://recaptcha.net/plugins/php/ + * - Get a reCAPTCHA API Key + * http://recaptcha.net/api/getkey + * - Discussion group + * http://groups.google.com/group/recaptcha + * + * Copyright (c) 2007 reCAPTCHA -- http://recaptcha.net + * AUTHORS: + * Mike Crawford + * Ben Maurer + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/** + * The reCAPTCHA server URL's + */ +define("RECAPTCHA_API_SERVER", "http://api.recaptcha.net"); +define("RECAPTCHA_API_SECURE_SERVER", "https://api-secure.recaptcha.net"); +define("RECAPTCHA_VERIFY_SERVER", "api-verify.recaptcha.net"); + +/** + * Encodes the given data into a query string format + * @param $data - array of string elements to be encoded + * @return string - encoded request + */ +function _recaptcha_qsencode ($data) { + $req = ""; + foreach ( $data as $key => $value ) + $req .= $key . '=' . urlencode( stripslashes($value) ) . '&'; + + // Cut the last '&' + $req=substr($req,0,strlen($req)-1); + return $req; +} + + + +/** + * Submits an HTTP POST to a reCAPTCHA server + * @param string $host + * @param string $path + * @param array $data + * @param int port + * @return array response + */ +function _recaptcha_http_post($host, $path, $data, $port = 80) { + + $req = _recaptcha_qsencode ($data); + + $http_request = "POST $path HTTP/1.0\r\n"; + $http_request .= "Host: $host\r\n"; + $http_request .= "Content-Type: application/x-www-form-urlencoded;\r\n"; + $http_request .= "Content-Length: " . strlen($req) . "\r\n"; + $http_request .= "User-Agent: reCAPTCHA/PHP\r\n"; + $http_request .= "\r\n"; + $http_request .= $req; + + $response = ''; + if( false == ( $fs = @fsockopen($host, $port, $errno, $errstr, 10) ) ) { + die ('Could not open socket'); + } + + fwrite($fs, $http_request); + + while ( !feof($fs) ) + $response .= fgets($fs, 1160); // One TCP-IP packet + fclose($fs); + $response = explode("\r\n\r\n", $response, 2); + + return $response; +} + + + +/** + * Gets the challenge HTML (javascript and non-javascript version). + * This is called from the browser, and the resulting reCAPTCHA HTML widget + * is embedded within the HTML form it was called from. + * @param string $pubkey A public key for reCAPTCHA + * @param string $error The error given by reCAPTCHA (optional, default is null) + * @param boolean $use_ssl Should the request be made over ssl? (optional, default is false) + + * @return string - The HTML to be embedded in the user's form. + */ +function recaptcha_get_html ($pubkey, $error = null, $use_ssl = false) +{ + if ($pubkey == null || $pubkey == '') { + die ("To use reCAPTCHA you must get an API key from <a href='http://recaptcha.net/api/getkey'>http://recaptcha.net/api/getkey</a>"); + } + + if ($use_ssl) { + $server = RECAPTCHA_API_SECURE_SERVER; + } else { + $server = RECAPTCHA_API_SERVER; + } + + $errorpart = ""; + if ($error) { + $errorpart = "&error=" . $error; + } + return '<script type="text/javascript" src="'. $server . '/challenge?k=' . $pubkey . $errorpart . '"></script> + + <noscript> + <iframe src="'. $server . '/noscript?k=' . $pubkey . $errorpart . '" height="300" width="500" frameborder="0"></iframe><br/> + <textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea> + <input type="hidden" name="recaptcha_response_field" value="manual_challenge"/> + </noscript>'; +} + + + + +/** + * A ReCaptchaResponse is returned from recaptcha_check_answer() + */ +class ReCaptchaResponse { + var $is_valid; + var $error; +} + + +/** + * Calls an HTTP POST function to verify if the user's guess was correct + * @param string $privkey + * @param string $remoteip + * @param string $challenge + * @param string $response + * @param array $extra_params an array of extra variables to post to the server + * @return ReCaptchaResponse + */ +function recaptcha_check_answer ($privkey, $remoteip, $challenge, $response, $extra_params = array()) +{ + if ($privkey == null || $privkey == '') { + die ("To use reCAPTCHA you must get an API key from <a href='http://recaptcha.net/api/getkey'>http://recaptcha.net/api/getkey</a>"); + } + + if ($remoteip == null || $remoteip == '') { + die ("For security reasons, you must pass the remote ip to reCAPTCHA"); + } + + + + //discard spam submissions + if ($challenge == null || strlen($challenge) == 0 || $response == null || strlen($response) == 0) { + $recaptcha_response = new ReCaptchaResponse(); + $recaptcha_response->is_valid = false; + $recaptcha_response->error = 'incorrect-captcha-sol'; + return $recaptcha_response; + } + + $response = _recaptcha_http_post (RECAPTCHA_VERIFY_SERVER, "/verify", + array ( + 'privatekey' => $privkey, + 'remoteip' => $remoteip, + 'challenge' => $challenge, + 'response' => $response + ) + $extra_params + ); + + $answers = explode ("\n", $response [1]); + $recaptcha_response = new ReCaptchaResponse(); + + if (trim ($answers [0]) == 'true') { + $recaptcha_response->is_valid = true; + } + else { + $recaptcha_response->is_valid = false; + $recaptcha_response->error = $answers [1]; + } + return $recaptcha_response; + +} + +/** + * gets a URL where the user can sign up for reCAPTCHA. If your application + * has a configuration page where you enter a key, you should provide a link + * using this function. + * @param string $domain The domain where the page is hosted + * @param string $appname The name of your application + */ +function recaptcha_get_signup_url ($domain = null, $appname = null) { + return "http://recaptcha.net/api/getkey?" . _recaptcha_qsencode (array ('domain' => $domain, 'app' => $appname)); +} + +function _recaptcha_aes_pad($val) { + $block_size = 16; + $numpad = $block_size - (strlen ($val) % $block_size); + return str_pad($val, strlen ($val) + $numpad, chr($numpad)); +} + +/* Mailhide related code */ + +function _recaptcha_aes_encrypt($val,$ky) { + if (! function_exists ("mcrypt_encrypt")) { + die ("To use reCAPTCHA Mailhide, you need to have the mcrypt php module installed."); + } + $mode=MCRYPT_MODE_CBC; + $enc=MCRYPT_RIJNDAEL_128; + $val=_recaptcha_aes_pad($val); + return mcrypt_encrypt($enc, $ky, $val, $mode, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"); +} + + +function _recaptcha_mailhide_urlbase64 ($x) { + return strtr(base64_encode ($x), '+/', '-_'); +} + +/* gets the reCAPTCHA Mailhide url for a given email, public key and private key */ +function recaptcha_mailhide_url($pubkey, $privkey, $email) { + if ($pubkey == '' || $pubkey == null || $privkey == "" || $privkey == null) { + die ("To use reCAPTCHA Mailhide, you have to sign up for a public and private key, " . + "you can do so at <a href='http://mailhide.recaptcha.net/apikey'>http://mailhide.recaptcha.net/apikey</a>"); + } + + + $ky = pack('H*', $privkey); + $cryptmail = _recaptcha_aes_encrypt ($email, $ky); + + return "http://mailhide.recaptcha.net/d?k=" . $pubkey . "&c=" . _recaptcha_mailhide_urlbase64 ($cryptmail); +} + +/** + * gets the parts of the email to expose to the user. + * eg, given johndoe@example,com return ["john", "example.com"]. + * the email is then displayed as john...@example.com + */ +function _recaptcha_mailhide_email_parts ($email) { + $arr = preg_split("/@/", $email ); + + if (strlen ($arr[0]) <= 4) { + $arr[0] = substr ($arr[0], 0, 1); + } else if (strlen ($arr[0]) <= 6) { + $arr[0] = substr ($arr[0], 0, 3); + } else { + $arr[0] = substr ($arr[0], 0, 4); + } + return $arr; +} + +/** + * Gets html to display an email address given a public an private key. + * to get a key, go to: + * + * http://mailhide.recaptcha.net/apikey + */ +function recaptcha_mailhide_html($pubkey, $privkey, $email) { + $emailparts = _recaptcha_mailhide_email_parts ($email); + $url = recaptcha_mailhide_url ($pubkey, $privkey, $email); + + return htmlentities($emailparts[0]) . "<a href='" . htmlentities ($url) . + "' onclick=\"window.open('" . htmlentities ($url) . "', '', 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width=500,height=300'); return false;\" title=\"Reveal this e-mail address\">...</a>@" . htmlentities ($emailparts [1]); + +} + + +?> Added: trunk/1.2/templates/extern/helpdesk/SCRIPT_EXTRA.shared.tmpl =================================================================== --- trunk/1.2/templates/extern/helpdesk/SCRIPT_EXTRA.shared.tmpl (rev 0) +++ trunk/1.2/templates/extern/helpdesk/SCRIPT_EXTRA.shared.tmpl 2009-10-25 18:37:02 UTC (rev 992) @@ -0,0 +1,5 @@ +<script type= "text/javascript"> +var RecaptchaOptions = { +theme: 'clean' +}; +</script> \ No newline at end of file Modified: trunk/1.2/templates/extern/helpdesk/view.content.tmpl =================================================================== --- trunk/1.2/templates/extern/helpdesk/view.content.tmpl 2009-09-21 14:53:33 UTC (rev 991) +++ trunk/1.2/templates/extern/helpdesk/view.content.tmpl 2009-10-25 18:37:02 UTC (rev 992) @@ -63,14 +63,14 @@ <td></td> <td colspan="2">Remark: <br> - <textarea name="remark" rows="8" cols="80"></textarea> + <textarea name="remark" rows="8" cols="80">{POST_remark}</textarea> </td> </tr> <tr> <td></td> - <td colspan="2"> - <input name="action" value="Remark" type="submit"> + <td colspan="2">{captcha} + <input name="action" value="Remark" type="submit"> </td> </tr> Modified: trunk/1.2/templates/header.shared.tmpl =================================================================== --- trunk/1.2/templates/header.shared.tmpl 2009-09-21 14:53:33 UTC (rev 991) +++ trunk/1.2/templates/header.shared.tmpl 2009-10-25 18:37:02 UTC (rev 992) @@ -3,6 +3,7 @@ <title>{html_title}</title> <link rel=stylesheet type='text/css' href='/css/common.css'> {XAJAX_HEADERS} + {SCRIPT_EXTRA} <script language="javascript" src="/js/prototype.js" type="text/javascript"></script> <script language="javascript" src="/js/scriptaculous.js" type="text/javascript"></script> <script language="javascript" src="/js/cs-project.js" type="text/javascript"></script> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |