<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wikido.isoftdata.com//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Duff</id>
	<title>ISoft Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wikido.isoftdata.com//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Duff"/>
	<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Special:Contributions/Duff"/>
	<updated>2026-06-13T02:52:50Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.37.2</generator>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=User:Duff&amp;diff=9626</id>
		<title>User:Duff</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=User:Duff&amp;diff=9626"/>
		<updated>2016-09-01T15:01:43Z</updated>

		<summary type="html">&lt;p&gt;Duff: Updating employer&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Josh Duff was an [[ISoft]] employee.&lt;br /&gt;
&lt;br /&gt;
== Work at ISoft ==&lt;br /&gt;
Josh was hired part-time on 2005-09-20, referred by fraternity brother [[Dillon Sadofsky]].  His starting job description was supporting [[ITrack Pro]] by answering customer calls, and maintaining reports.&lt;br /&gt;
&lt;br /&gt;
He became a full-time employee on 2006-12-23.&lt;br /&gt;
&lt;br /&gt;
During his first few years at ISoft, he began transitioning from phone support to software development.  He spent much of his time at ISoft as the primary developer for ITrack Pro, while also writing code for [[ITrack Enterprise]] as well as many other smaller projects.&lt;br /&gt;
&lt;br /&gt;
In his later years, he took on more [[web development]], writing [[ITrack/Enterprise/LXW|ITrack LXW]] and other mobile apps.&lt;br /&gt;
&lt;br /&gt;
He left ISoft on 2013-03-01 to work for [http://www.emaildatasource.com/ eDataSource].&lt;br /&gt;
&lt;br /&gt;
He left eDataSource on 2016-08-12 to work for [https://cake.co/ Cake].&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
Josh can be contacted by members of the [[ISoft chat]] server at JoshDuff@im.isoftdata.com.&lt;br /&gt;
&lt;br /&gt;
== Other presence on the internet ==&lt;br /&gt;
Josh maintains a [http://joshduff.com home page] with sporadic posts, mostly of a libertarian or geeky nature.&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Known_Ebay_Problems&amp;diff=7052</id>
		<title>Known Ebay Problems</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Known_Ebay_Problems&amp;diff=7052"/>
		<updated>2013-09-18T19:39:46Z</updated>

		<summary type="html">&lt;p&gt;Duff: Misspelling, formatting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This wiki is for fixes to common (but show stopping) problems with our ebay extension and TurboLister&lt;br /&gt;
&lt;br /&gt;
==TurboLister HTML Problems==&lt;br /&gt;
===Not Displaying Correctly===&lt;br /&gt;
====Cause====&lt;br /&gt;
Sometimes HTML won&amp;#039;t display correctly if it has certain Javascript or CSS elements. &lt;br /&gt;
&lt;br /&gt;
====Resolution====&lt;br /&gt;
One fix for this is to make sure TurboLister is up to date and make sure that you are using Turbo Lister 2. If a Description is still not displaying correctly try taking the Description and putting it into an html document and opening it in your browser. &lt;br /&gt;
&lt;br /&gt;
====Similar Problems====&lt;br /&gt;
Problem is HTML or JavaScript related.&lt;br /&gt;
&lt;br /&gt;
===Template===&lt;br /&gt;
====Cause====&lt;br /&gt;
Sometimes users will have additional templates in turbolister to help with things like return policy and shipping details but this can also cause problems with the price, auction format, title, and description being changed. &lt;br /&gt;
&lt;br /&gt;
====Resolution====&lt;br /&gt;
The fix is to delete or change the TurboLister template.&lt;br /&gt;
&lt;br /&gt;
====Similar Problems====&lt;br /&gt;
ITrack ebay Template is wrong or wrong ITrack ebay Template is being used&lt;br /&gt;
&lt;br /&gt;
==Image Problems==&lt;br /&gt;
Before anything make sure all links look like:  &amp;quot;http://www.cyclerecyclers.net/image.php?productcode={?ProductCode}&amp;amp;inventoryid={?PartNum}&amp;amp;imageid={X}&amp;quot; and X is replaced by a number that is greater than 0&lt;br /&gt;
&lt;br /&gt;
===Preview Image not Showing up===&lt;br /&gt;
====Cause====&lt;br /&gt;
This means that they don&amp;#039;t have images in their ITrack image directory which can be found under &amp;quot;imagesdir&amp;quot; in the Host.ini&lt;br /&gt;
&lt;br /&gt;
====Resolution====&lt;br /&gt;
Change the directory where ITrack looks for and saves images&lt;br /&gt;
&lt;br /&gt;
===No Images Show up===&lt;br /&gt;
====Cause====&lt;br /&gt;
This usually means that images aren&amp;#039;t sync&amp;#039;d so it assumes there are no pictures associated with the part trying to be listed on HTP/Recyclers/Cyclerecyclers&lt;br /&gt;
&lt;br /&gt;
====Resolution====&lt;br /&gt;
Re-sync their images and make sure Replikwando is working&lt;br /&gt;
&lt;br /&gt;
==Steps for Debugging TurboLister Problems==&lt;br /&gt;
# Check the CSV Created by ITrack before it is imported into TurboLister and make sure all values are correct and present&lt;br /&gt;
# Check to see if TurboLister is Throwing any Errors&lt;br /&gt;
# Check Listing in TurboLister to make sure all values are correct and present&lt;br /&gt;
# Make sure a TurboLister Template isn&amp;#039;t interfering with Values sent from ITrack&lt;br /&gt;
# (If Description Related) Copy out description into an HTML document and open it in a Web Browser to see if it displays correctly&lt;br /&gt;
# Get TurboLister User File, Information, Settings, and Templates to test independently&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=ISoft_Data_Systems&amp;diff=7000</id>
		<title>ISoft Data Systems</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=ISoft_Data_Systems&amp;diff=7000"/>
		<updated>2013-08-12T18:49:47Z</updated>

		<summary type="html">&lt;p&gt;Duff: /* Application Development */ I am no longer available at this extension&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ISoft Data Systems is a software development company in Lincoln, Nebraska.  They specialize in custom web development and business management solutions for the recycling and salvage industries.&lt;br /&gt;
&lt;br /&gt;
[[Image:Turbine Flats from south side small.jpg|frame|ISoft Data Systems is located in the Turbine Flats Building.]]&lt;br /&gt;
&lt;br /&gt;
== Address ==&lt;br /&gt;
2124 Y Street Flat 201 &amp;lt;br&amp;gt;&lt;br /&gt;
Lincoln, NE 68503&lt;br /&gt;
&lt;br /&gt;
==Chat==&lt;br /&gt;
(8am - ~7pm [http://en.wikipedia.org/wiki/Central_Time_Zone_(North_America) Central]) Call or email us and we will help you set up a chat account so you can easily contact us whenever you like!&lt;br /&gt;
&lt;br /&gt;
==Email==&lt;br /&gt;
* ITrack Support: [mailto:support@isoftdata.com?Subject=ITrack%20Support%20Question support@isoftdata.com]&lt;br /&gt;
* HeavyTruckParts.net Support: [mailto:support@heavytruckparts.net?Subject=Heavy%20Truck%20Parts%20Support%20Question support@heavytruckparts.net]&lt;br /&gt;
&lt;br /&gt;
==Phone Numbers==&lt;br /&gt;
* Toll free phone: 800-929-1829 (8am - 6pm Central)&lt;br /&gt;
* Nebraska phone: 402-435-3850 (8am - 6pm Central)&lt;br /&gt;
* Fax: 402-435-7076&lt;br /&gt;
&lt;br /&gt;
==Departments==&lt;br /&gt;
Those numbers there are our extension numbers!&lt;br /&gt;
&lt;br /&gt;
===Tech Support===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;201 - All Support&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** 110 - [[Cody Hanson]]&lt;br /&gt;
** 107 - [[Justin Wheeler]]&lt;br /&gt;
** 108 - [[Mark Hardisty]]&lt;br /&gt;
** 118 - [[Jordan Bonge]]&lt;br /&gt;
&lt;br /&gt;
=== Management ===&lt;br /&gt;
* 106 - [[Brendan Evans]] (Sales)&lt;br /&gt;
* 103 - [[Dan Syde]] (Sales)&lt;br /&gt;
* 100 - [[Emily Lowell]]&lt;br /&gt;
* 101 - [[Matthew Wegener]]&lt;br /&gt;
** 301 - Voicemail&lt;br /&gt;
* 111 - [[Tony Merritt]]&lt;br /&gt;
* 203 - [[Umeda Islamova]]&lt;br /&gt;
&lt;br /&gt;
=== Application Development ===&lt;br /&gt;
* 105 - [[Dillon Sadofsky]]&lt;br /&gt;
* 115 - [[Justin McKinstry]]&lt;br /&gt;
* 102 - [[Dayton Lowell]]&lt;br /&gt;
&lt;br /&gt;
=== Web Development ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;202 - All web development&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** 114 - [[Amos Sterns]]&lt;br /&gt;
** 112 - [[Andrew Johnson]]&lt;br /&gt;
** 113 - [[Brian Roy]]&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
[[:Category:ISoft Employees|ISoft Employees]]&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=User:Duff&amp;diff=6829</id>
		<title>User:Duff</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=User:Duff&amp;diff=6829"/>
		<updated>2013-05-17T01:37:32Z</updated>

		<summary type="html">&lt;p&gt;Duff: rm :Category:ISoft Employees&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Josh Duff was an [[ISoft]] employee.&lt;br /&gt;
&lt;br /&gt;
== Education ==&lt;br /&gt;
Josh was homeschooled by his parents until 2003.  At that time, he moved to Lincoln to pursue a business degree (and computer science minor) with a full scholarship at UNL.&lt;br /&gt;
&lt;br /&gt;
After 6 semesters at the university, he stopped taking classes, due to disenfranchisement with university-style education, and failing to complete the necessary credit hours to maintain his scholarship.&lt;br /&gt;
&lt;br /&gt;
== Work at ISoft ==&lt;br /&gt;
Josh was hired part-time on 2005-09-20, referred by fraternity brother [[Dillon Sadofsky]].  His starting job description was supporting [[ITrack Pro]] by answering customer calls, and maintaining reports.&lt;br /&gt;
&lt;br /&gt;
He became a full-time employee on 2006-12-23.&lt;br /&gt;
&lt;br /&gt;
During his first few years at ISoft, he began transitioning from phone support to software development.  He spent much of his time at ISoft as the primary developer for ITrack Pro, while also writing code for [[ITrack Enterprise]] as well as many other smaller projects.&lt;br /&gt;
&lt;br /&gt;
In his later years, he took on more [[web development]], writing [[ITrack/Enterprise/LXW|ITrack LXW]] and other mobile apps.&lt;br /&gt;
&lt;br /&gt;
He left ISoft on 2013-03-01 to work for [http://www.emaildatasource.com/ eDataSource].&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
Josh can be contacted by members of the [[ISoft chat]] server at JoshDuff@im.isoftdata.com.&lt;br /&gt;
&lt;br /&gt;
== Other presence on the internet ==&lt;br /&gt;
Josh maintains a [http://joshduff.com home page] with sporadic posts, mostly of a libertarian or geeky nature.&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=User:Duff&amp;diff=6527</id>
		<title>User:Duff</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=User:Duff&amp;diff=6527"/>
		<updated>2013-03-06T00:47:29Z</updated>

		<summary type="html">&lt;p&gt;Duff: *cough*&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Josh Duff was an [[ISoft]] employee.&lt;br /&gt;
&lt;br /&gt;
== Education ==&lt;br /&gt;
Josh was homeschooled by his parents until 2003.  At that time, he moved to Lincoln to pursue a business degree (and computer science minor) with a full scholarship at UNL.&lt;br /&gt;
&lt;br /&gt;
After 6 semesters at the university, he stopped taking classes, due to disenfranchisement with university-style education, and failing to complete the necessary credit hours to maintain his scholarship.&lt;br /&gt;
&lt;br /&gt;
== Work at ISoft ==&lt;br /&gt;
Josh was hired part-time on 2005-09-20, referred by fraternity brother [[Dillon Sadofsky]].  His starting job description was supporting [[ITrack Pro]] by answering customer calls, and maintaining reports.&lt;br /&gt;
&lt;br /&gt;
He became a full-time employee on 2006-12-23.&lt;br /&gt;
&lt;br /&gt;
During his first few years at ISoft, he began transitioning from phone support to software development.  He spent much of his time at ISoft as the primary developer for ITrack Pro, while also writing code for [[ITrack Enterprise]] as well as many other smaller projects.&lt;br /&gt;
&lt;br /&gt;
In his later years, he took on more [[web development]], writing [[ITrack/Enterprise/LXW|ITrack LXW]] and other mobile apps.&lt;br /&gt;
&lt;br /&gt;
He left ISoft on 2013-03-01 to work for [http://www.emaildatasource.com/ eDataSource].&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
Josh can be contacted by members of the [[ISoft chat]] server at JoshDuff@im.isoftdata.com.&lt;br /&gt;
&lt;br /&gt;
== Other presence on the internet ==&lt;br /&gt;
Josh maintains a [http://joshduff.com home page] with sporadic posts, mostly of a libertarian or geeky nature.&lt;br /&gt;
&lt;br /&gt;
[[Category:ISoft Employees]]&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Installing_LXW&amp;diff=6508</id>
		<title>Installing LXW</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Installing_LXW&amp;diff=6508"/>
		<updated>2013-03-01T17:09:43Z</updated>

		<summary type="html">&lt;p&gt;Duff: /* Configure config.json */ Removing unnecessary data&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The new version of ITrack LX, colloquially known as LXW, is the faster and sexier version of ITrack designed to run in the browser, primarily on handheld scanner devices.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
Besides the regular version of [[MySQL]] used by ITrack Enterprise, LXW requires:&lt;br /&gt;
* [http://httpd.apache.org/download.cgi Apache] 2.2 or higher&lt;br /&gt;
* [http://php.net/downloads.php PHP] 5.3 or higher&lt;br /&gt;
* [http://nodejs.org/download/ Node.js] 0.8 or higher&lt;br /&gt;
* [http://subversion.apache.org/ SVN] 1.6 or higher&lt;br /&gt;
&lt;br /&gt;
== Installing the server-side code ==&lt;br /&gt;
This is the PHP code that talks to the database!  It should be checked out somewhere that is &amp;#039;&amp;#039;not&amp;#039;&amp;#039; accessible via HTTP.&lt;br /&gt;
&lt;br /&gt;
The directory to check out is [https://svn.isoftdata.com/svn/Web/tinymvc-branches/lxw-release https://svn.isoftdata.com/svn/Web/tinymvc-branches/lxw-release].&lt;br /&gt;
&lt;br /&gt;
To configure the database connection, edit /lxw/configs/database.php.&lt;br /&gt;
&lt;br /&gt;
== Installing the client-side code ==&lt;br /&gt;
This is the code that is accessible via HTTP!  Check it out to your Apache htdocs folder, or whatever other folder will get it served up to the tubes.&lt;br /&gt;
&lt;br /&gt;
The directory to check out is [https://svn.isoftdata.com/svn/Web/tinymvc-branches/lxw-release/lxw/client https://svn.isoftdata.com/svn/Web/tinymvc-branches/lxw-release/lxw/client].&lt;br /&gt;
&lt;br /&gt;
To configure the connection to the server-side code: edit line 15 of server/index.php to point it at the path where you checked out the server-side code.&lt;br /&gt;
&lt;br /&gt;
To configure client application settings (which should all have reasonable defaults), you can edit the config.js file in the client path.&lt;br /&gt;
&lt;br /&gt;
== Setting Up the Auto-Updater ==&lt;br /&gt;
This is the process that will download updates for LXW and then install them. &lt;br /&gt;
&lt;br /&gt;
[https://svn.isoftdata.com/Web/javascript-trunk/isoft-updater-example/ https://svn.isoftdata.com/Web/javascript-trunk/isoft-updater-example/]&lt;br /&gt;
&lt;br /&gt;
#Transfer contents of this directory to the server hosting LXW. The standard directory for Linux based servers is /var/www/lxw/updater (This directory will not exist yet.)&lt;br /&gt;
#Configure config.json&lt;br /&gt;
#Run the .sh files&lt;br /&gt;
##install.sh&lt;br /&gt;
##run.sh&lt;br /&gt;
#Add updater to crontab&lt;br /&gt;
&lt;br /&gt;
===Configure config.json ===&lt;br /&gt;
An example of a config.json&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lang=&amp;quot;json&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
        &amp;quot;update_url&amp;quot;: &amp;quot;autoupdate URL here&amp;quot;,&lt;br /&gt;
        &amp;quot;product_code&amp;quot;: &amp;quot;valid product code here&amp;quot;,&lt;br /&gt;
        &amp;quot;download_directory&amp;quot;: &amp;quot;/var/www/lxw-release/updater/downloaded-all&amp;quot;,&lt;br /&gt;
        &amp;quot;destination_directories&amp;quot;: {&lt;br /&gt;
                &amp;quot;default&amp;quot;: &amp;quot;/var/www/lxw-release/updater/downloaded-latest&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;extraction_directories&amp;quot;: {&lt;br /&gt;
                &amp;quot;LXW-client.zip&amp;quot;: &amp;quot;/var/www/html/lxw&amp;quot;,&lt;br /&gt;
                &amp;quot;LXW-server.zip&amp;quot;: &amp;quot;/var/www/lxw-release&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After the updater is run properly then a new section will appear below this section and it will look like this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;    &lt;br /&gt;
     &lt;br /&gt;
 &amp;quot;versions&amp;quot;: {&lt;br /&gt;
 &amp;quot;LXW-client.zip&amp;quot;: &amp;quot;#####&amp;quot;,&lt;br /&gt;
 &amp;quot;LXW-server.zip&amp;quot;: &amp;quot;#####&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Run .sh Files===&lt;br /&gt;
Unfortunately as of February 25th 2013 you are unable to run the .sh files as they will be unable to find the config file. Instead you can run the contents of the files without any problem. Here is an example of each file as you would use it for LKQ.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;install.sh&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 sudo npm install isoft-updater -g&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;run.sh&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 node /lib/node_modules/isoft-updater /var/www/lxw-release/updater/config.json&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Add Updater to Crontab===&lt;br /&gt;
The last bit to setting up the auto updater is the &amp;quot;auto&amp;quot; part. Here is how to access and edit the crontab.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 crontab -e&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is what LKQ&amp;#039;s crontab looks like for the autoupdater.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  12 21  *   *   *   node /lib/node_modules/isoft-updater /var/www/lxw-release/updater/config.json&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the format that crontab uses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 *  *  *  *  *  command to be executed&lt;br /&gt;
 -  -  -  -  -&lt;br /&gt;
 |  |  |  |  |&lt;br /&gt;
 |  |  |  |  +----- day of week (0 - 6) (Sunday=0)&lt;br /&gt;
 |  |  |  +------- month (1 - 12)&lt;br /&gt;
 |  |  +--------- day of month (1 - 31)&lt;br /&gt;
 |  +----------- hour (0 - 23)&lt;br /&gt;
 +------------- min (0 - 59)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Note====&lt;br /&gt;
Removing the version section in config.json will cause it to redownload the latest update during the next scheduled update cycle or forced update. Can be used to test the process.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
Browsing to the [the URL you would expect to correspond to the client-side files you installed]/server/index.php should show you a snide remark embedded in JSON.&lt;br /&gt;
&lt;br /&gt;
Browsing to the regular URL should show you a screen asking you to identify your store number (assuming that your web server is configured to serve up index.html files when you browse to a directory).&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=ITrack/Enterprise/LXW&amp;diff=6507</id>
		<title>ITrack/Enterprise/LXW</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=ITrack/Enterprise/LXW&amp;diff=6507"/>
		<updated>2013-03-01T17:02:20Z</updated>

		<summary type="html">&lt;p&gt;Duff: Adding section for Fast Inventory Move&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The mobile version of ITrack, for running warehouses with scanners!&lt;br /&gt;
&lt;br /&gt;
== Picking ==&lt;br /&gt;
# Scan a sales order barcode (on a picking label)&lt;br /&gt;
# Scan a part&lt;br /&gt;
# Scan the source location where you found the part&lt;br /&gt;
## If the location is not one of the locations where the part was currently allocated from, you will need to select the allocation location that you are picking the part for&lt;br /&gt;
# Scan a destination location (if you want to, otherwise you can close the screen or scan a new sales order)&lt;br /&gt;
&lt;br /&gt;
The part gets marked as picked in the delivery system, and gets moved to the destination location.  If you don&amp;#039;t specify a destination location, it uses the default, which is set in the store settings.&lt;br /&gt;
&lt;br /&gt;
== Inventory move ==&lt;br /&gt;
# Scan a location&lt;br /&gt;
# Scan any number of parts at the location&lt;br /&gt;
# Scan a destination location&lt;br /&gt;
&lt;br /&gt;
All the parts you scanned get moved!&lt;br /&gt;
&lt;br /&gt;
== Inventory Detail ==&lt;br /&gt;
Scan any part to see information about it!&lt;br /&gt;
&lt;br /&gt;
== Inventory Count ==&lt;br /&gt;
# Scan a location&lt;br /&gt;
# Scan all the parts at that location&lt;br /&gt;
# Scan a new location to count at, or close the screen&lt;br /&gt;
&lt;br /&gt;
All of the parts that you found at that location are moved there, if necessary.  All parts that should have been found there, but weren&amp;#039;t, get moved to the Variance location!&lt;br /&gt;
&lt;br /&gt;
== Fast Inventory Move ==&lt;br /&gt;
# Scan any number of parts&lt;br /&gt;
# Scan a location to move those parts to&lt;br /&gt;
&lt;br /&gt;
Scanned inventory records will be moved if:&lt;br /&gt;
* All quantity for a scanned inventory record are located at the same location&lt;br /&gt;
OR&lt;br /&gt;
* All quantity for a scanned inventory record has been scanned to move&lt;br /&gt;
Otherwise, none of the quantity for part will be moved.&lt;br /&gt;
&lt;br /&gt;
The screen will show whether or not the part will be moved by coloring the line green, and warn you that a move will not happen by coloring the line red.&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=User:Duff&amp;diff=6506</id>
		<title>User:Duff</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=User:Duff&amp;diff=6506"/>
		<updated>2013-03-01T16:59:10Z</updated>

		<summary type="html">&lt;p&gt;Duff: It&amp;#039;s been fun&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Josh Duff was an [[ISoft]] employee.&lt;br /&gt;
&lt;br /&gt;
== Education ==&lt;br /&gt;
Josh was homeschooled by his parents until 2003.  At that time, he moved to Lincoln to pursue a business degree (and computer science minor) with a full scholarship at UNL.&lt;br /&gt;
&lt;br /&gt;
After 6 semesters at the university, he stopped taking classes, due to disenfranchisement with university-style education, and failing to complete the necessary credit hours to maintain his scholarship.&lt;br /&gt;
&lt;br /&gt;
== Work at ISoft ==&lt;br /&gt;
Josh was hired part-time on 2005-09-20, referred by fraternity brother [[Dillon Sadofsky]].  His starting job description was supporting [[ITrack Pro]] by answering customer calls, and maintaining reports.&lt;br /&gt;
&lt;br /&gt;
He became a full-time employee on 2006-12-23.&lt;br /&gt;
&lt;br /&gt;
During his first few years at ISoft, he began transitioning from phone support to software development.  He spent much of his time at ISoft as the primary developer for ITrack Pro, while also writing code for [[ITrack Enterprise]] as well as many other smaller projects.&lt;br /&gt;
&lt;br /&gt;
In has later years, he took on more [[web development]], writing [[ITrack/Enterprise/LXW|ITrack LXW]] and other mobile apps.&lt;br /&gt;
&lt;br /&gt;
He left ISoft on 2013-03-01 to work for [http://www.emaildatasource.com/ eDataSource].&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
Josh can be contacted by members of the [[ISoft chat]] server at JoshDuff@im.isoftdata.com.&lt;br /&gt;
&lt;br /&gt;
== Other presence on the internet ==&lt;br /&gt;
Josh maintains a [http://joshduff.com home page] with sporadic posts, mostly of a libertarian or geeky nature.&lt;br /&gt;
&lt;br /&gt;
[[Category:ISoft Employees]]&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_development/model-router&amp;diff=6494</id>
		<title>Web development/model-router</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_development/model-router&amp;diff=6494"/>
		<updated>2013-02-20T20:36:51Z</updated>

		<summary type="html">&lt;p&gt;Duff: Adding a note about method-specific routing&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;model-router does a few things that make writing data servers easier:&lt;br /&gt;
* Routing&lt;br /&gt;
* Session handling/state&lt;br /&gt;
* Wrapping up authentication&lt;br /&gt;
* Checking for parameters existence&lt;br /&gt;
&lt;br /&gt;
== Including ==&lt;br /&gt;
You could have multiple router-things if you wanted to - you know, in case you were running multiple sites from the same node.js server, or something - but for your purposes you&amp;#039;ll probably just want to instantiate one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Router = require(&amp;#039;model-router&amp;#039;)&lt;br /&gt;
var router = new Router()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It doesn&amp;#039;t launch any servers of its own, that would be rude.  You&amp;#039;ll want to create your own server in the usual way, and then tell model-router to handle it if appropriate.&lt;br /&gt;
&lt;br /&gt;
model-router only sends back JSON responses, and doesn&amp;#039;t do anything with static content out of the box, so if you want to serve HTML/JavaScript files or something, you&amp;#039;ll have to do it yourself:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
require(&amp;#039;http&amp;#039;).createServer(function(req, res) {&lt;br /&gt;
	var pathname = require(&amp;#039;url&amp;#039;).parse(req.url).pathname&lt;br /&gt;
	var match&lt;br /&gt;
	if (match = /^\/static(\/.*)$/.exec(pathname)) {&lt;br /&gt;
		require(&amp;#039;send&amp;#039;)(req, match[1]).root(&amp;#039;./static/&amp;#039;).pipe(res)&lt;br /&gt;
	} else {&lt;br /&gt;
		router.handleRequest(req, res)&lt;br /&gt;
	}&lt;br /&gt;
}).listen(8080)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Routing ==&lt;br /&gt;
All right, your server is running.  You want to add a new response to certain messages - so that requests to yourdomain.com/information/time would get the current server time back, or something dumb like that.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
router.route(&amp;#039;/information/time&amp;#039;, function(parameters, session, next) {&lt;br /&gt;
	next(new Date())&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Browsing to the URL should immediately get you back this response:&lt;br /&gt;
&amp;lt;pre&amp;gt;{&amp;quot;success&amp;quot;:true,&amp;quot;output&amp;quot;:&amp;quot;2013-02-19T22:00:56.507Z&amp;quot;}&amp;lt;/pre&amp;gt;&lt;br /&gt;
But let&amp;#039;s say that something bad happens on the server - maybe it&amp;#039;s an error if a client asks for the server time on a Sunday.  You could reflect that by rewriting the function like so:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
router.route(&amp;#039;/information/time&amp;#039;, function(parameters, session, next) {&lt;br /&gt;
	var date = new Date()&lt;br /&gt;
	if (date.getDay() === 0) {&lt;br /&gt;
		var err = new Error(&amp;quot;Don&amp;#039;t bother me on Sunday!&amp;quot;)&lt;br /&gt;
		err.code = &amp;#039;RESTING&amp;#039;&lt;br /&gt;
		next(err)&lt;br /&gt;
	} else {&lt;br /&gt;
		next(date)&lt;br /&gt;
	}&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Visiting that same URL on a Sunday would get you this response instead:&lt;br /&gt;
&amp;lt;pre&amp;gt;{&amp;quot;success&amp;quot;:false,&amp;quot;message&amp;quot;:&amp;quot;Don&amp;#039;t bother me on Sunday!&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;RESTING&amp;quot;}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In realistic scenarios, you&amp;#039;ll probably want to only respond with errors in the case of legitimate server errors, like a query failing or a missing file or something.&lt;br /&gt;
&lt;br /&gt;
== Session state ==&lt;br /&gt;
All right, so you can easily fling data back to the client.  Unbeknownst to you (before you read this sentence), it turns out that model-router also stores a session variable for each visitor (using a cookie that it sets on the client)!  You can set parameters on this object whenever you like, and access them again later:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
router.route(&amp;#039;/counter/increment&amp;#039;, function(parameters, session, next) {&lt;br /&gt;
	session.counter = (session.counter || 0) + 1&lt;br /&gt;
	next()&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
But now let&amp;#039;s say that you want to see the current value of that pointless counter!  But let&amp;#039;s use a new feature that I feel like telling you about: guaranteed parameters.  Like, you know, where a request is only valid if a certain value is provided?  You could do a bunch of input parsing, and check to see if certain values were defined or whatnot, but model-router handles some of that for you.&lt;br /&gt;
&lt;br /&gt;
Let&amp;#039;s only give back the current value if the user provides a parameter called &amp;quot;please&amp;quot; - we won&amp;#039;t even bother to check what it is, as long as it&amp;#039;s set:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
router.route(&amp;#039;/counter/value&amp;#039;, function(parameters, session, next) {&lt;br /&gt;
	next(session.counter || 0)&lt;br /&gt;
}, [&amp;#039;please&amp;#039;])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you don&amp;#039;t pass in a parameter with the request (either as part of the query string in the URL, or in the headers), you&amp;#039;ll get back this response:&lt;br /&gt;
&amp;lt;pre&amp;gt;{&amp;quot;success&amp;quot;:false,&amp;quot;message&amp;quot;:&amp;quot;You must provide these parameters: please&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;MISSING_PARAMETERS&amp;quot;}&amp;lt;/pre&amp;gt;&lt;br /&gt;
...but if the client does visit /counter/value?please=lol or whatever, they&amp;#039;ll totally get the value back!  And remember, that value is session-specific - visiting the same URL in a different browser could get you a completely different number.&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s up to you to maintain whatever state you like in those session variables.  Obvious candidates are user information, and state about current high-traffic jobs that the user is engaged in (if they&amp;#039;re sending requests every second, you probably don&amp;#039;t want to hit the database more than is necessary).&lt;br /&gt;
&lt;br /&gt;
You can (and probably want to) have session state expire after a certain amount of time.  This function call will cause sessions to expire after 10 minutes of inactivity:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
router.setSessionInactivityTimeout(10, function(session) {&lt;br /&gt;
	console.log(&amp;quot;A user just timed out!  They got their counter up to &amp;quot; + session.counter + &amp;quot; first, though.&amp;quot;)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
But you probably want to have users log in before you do anything else, right?  Well, hold on to your pants, because model-router makes that easy too.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
router.route(&amp;#039;PUT&amp;#039;, &amp;#039;/authenticate&amp;#039;, function(parameters, session, next) {&lt;br /&gt;
	if (parameters.username === &amp;#039;duff&amp;#039; &amp;amp;&amp;amp; parameters.password === &amp;#039;butts123&amp;#039;) {&lt;br /&gt;
		session.username = &amp;#039;duff&amp;#039;&lt;br /&gt;
		next(&amp;quot;You&amp;#039;re logged in now!&amp;quot;)&lt;br /&gt;
	} else {&lt;br /&gt;
		next(new Error(&amp;#039;Invalid login!&amp;#039;))&lt;br /&gt;
	}&lt;br /&gt;
}, [&amp;#039;username&amp;#039;, &amp;#039;password&amp;#039;])&lt;br /&gt;
&lt;br /&gt;
router.setSessionAuthentication(function(parameters, session, next) {&lt;br /&gt;
	var logged_in = typeof session.username !== &amp;#039;undefined&amp;#039;&lt;br /&gt;
	next(logged_in)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wait, what&amp;#039;s that extra parameter there at the beginning?  Oh, that&amp;#039;s just how you specify a route for a specific HTTP method!  The above code will only route requests to /authenticate to that function if the HTTP request was the PUT method.  If you want, you can still specify a handler for /authenticate without giving a method - in that case, the most specific routing will be used.&lt;br /&gt;
&lt;br /&gt;
We can now define routes that are only accessible to authenticated users:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
router.routeAuthenticated(&amp;#039;/counter/vip-value&amp;#039;, function(parameters, session, next) {&lt;br /&gt;
	next((session.counter || 0) * 10)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Try to visit /counter/vip-value without having authenticated, and you&amp;#039;ll see&lt;br /&gt;
&amp;lt;pre&amp;gt;{&amp;quot;success&amp;quot;:false,&amp;quot;message&amp;quot;:&amp;quot;You have to be authenticated to access /counter/vip-value&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;NOT_AUTHENTICATED&amp;quot;}&amp;lt;/pre&amp;gt;&lt;br /&gt;
...but visit it after authenticating, and you&amp;#039;ll see that your session&amp;#039;s magical incrementable value is much larger than it would otherwise appear!  Zoinks!&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_development/model-router&amp;diff=6493</id>
		<title>Web development/model-router</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_development/model-router&amp;diff=6493"/>
		<updated>2013-02-19T22:40:15Z</updated>

		<summary type="html">&lt;p&gt;Duff: All right, it&amp;#039;s a page that tells you some stuff now.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;model-router does a few things that make writing data servers easier:&lt;br /&gt;
* Routing&lt;br /&gt;
* Session handling/state&lt;br /&gt;
* Wrapping up authentication&lt;br /&gt;
* Checking for parameters existence&lt;br /&gt;
&lt;br /&gt;
== Including ==&lt;br /&gt;
You could have multiple router-things if you wanted to - you know, in case you were running multiple sites from the same node.js server, or something - but for your purposes you&amp;#039;ll probably just want to instantiate one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Router = require(&amp;#039;model-router&amp;#039;)&lt;br /&gt;
var router = new Router()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It doesn&amp;#039;t launch any servers of its own, that would be rude.  You&amp;#039;ll want to create your own server in the usual way, and then tell model-router to handle it if appropriate.&lt;br /&gt;
&lt;br /&gt;
model-router only sends back JSON responses, and doesn&amp;#039;t do anything with static content out of the box, so if you want to serve HTML/JavaScript files or something, you&amp;#039;ll have to do it yourself:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
require(&amp;#039;http&amp;#039;).createServer(function(req, res) {&lt;br /&gt;
	var pathname = require(&amp;#039;url&amp;#039;).parse(req.url).pathname&lt;br /&gt;
	var match&lt;br /&gt;
	if (match = /^\/static(\/.*)$/.exec(pathname)) {&lt;br /&gt;
		require(&amp;#039;send&amp;#039;)(req, match[1]).root(&amp;#039;./static/&amp;#039;).pipe(res)&lt;br /&gt;
	} else {&lt;br /&gt;
		router.handleRequest(req, res)&lt;br /&gt;
	}&lt;br /&gt;
}).listen(8080)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Routing ==&lt;br /&gt;
All right, your server is running.  You want to add a new response to certain messages - so that requests to yourdomain.com/information/time would get the current server time back, or something dumb like that.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
router.route(&amp;#039;/information/time&amp;#039;, function(parameters, session, next) {&lt;br /&gt;
	next(new Date())&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Browsing to the URL should immediately get you back this response:&lt;br /&gt;
&amp;lt;pre&amp;gt;{&amp;quot;success&amp;quot;:true,&amp;quot;output&amp;quot;:&amp;quot;2013-02-19T22:00:56.507Z&amp;quot;}&amp;lt;/pre&amp;gt;&lt;br /&gt;
But let&amp;#039;s say that something bad happens on the server - maybe it&amp;#039;s an error if a client asks for the server time on a Sunday.  You could reflect that by rewriting the function like so:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
router.route(&amp;#039;/information/time&amp;#039;, function(parameters, session, next) {&lt;br /&gt;
	var date = new Date()&lt;br /&gt;
	if (date.getDay() === 0) {&lt;br /&gt;
		var err = new Error(&amp;quot;Don&amp;#039;t bother me on Sunday!&amp;quot;)&lt;br /&gt;
		err.code = &amp;#039;RESTING&amp;#039;&lt;br /&gt;
		next(err)&lt;br /&gt;
	} else {&lt;br /&gt;
		next(date)&lt;br /&gt;
	}&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Visiting that same URL on a Sunday would get you this response instead:&lt;br /&gt;
&amp;lt;pre&amp;gt;{&amp;quot;success&amp;quot;:false,&amp;quot;message&amp;quot;:&amp;quot;Don&amp;#039;t bother me on Sunday!&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;RESTING&amp;quot;}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In realistic scenarios, you&amp;#039;ll probably want to only respond with errors in the case of legitimate server errors, like a query failing or a missing file or something.&lt;br /&gt;
&lt;br /&gt;
== Session state ==&lt;br /&gt;
All right, so you can easily fling data back to the client.  Unbeknownst to you (before you read this sentence), it turns out that model-router also stores a session variable for each visitor (using a cookie that it sets on the client)!  You can set parameters on this object whenever you like, and access them again later:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
router.route(&amp;#039;/counter/increment&amp;#039;, function(parameters, session, next) {&lt;br /&gt;
	session.counter = (session.counter || 0) + 1&lt;br /&gt;
	next()&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
But now let&amp;#039;s say that you want to see the current value of that pointless counter!  But let&amp;#039;s use a new feature that I feel like telling you about: guaranteed parameters.  Like, you know, where a request is only valid if a certain value is provided?  You could do a bunch of input parsing, and check to see if certain values were defined or whatnot, but model-router handles some of that for you.&lt;br /&gt;
&lt;br /&gt;
Let&amp;#039;s only give back the current value if the user provides a parameter called &amp;quot;please&amp;quot; - we won&amp;#039;t even bother to check what it is, as long as it&amp;#039;s set:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
router.route(&amp;#039;/counter/value&amp;#039;, function(parameters, session, next) {&lt;br /&gt;
	next(session.counter || 0)&lt;br /&gt;
}, [&amp;#039;please&amp;#039;])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you don&amp;#039;t pass in a parameter with the request (either as part of the query string in the URL, or in the headers), you&amp;#039;ll get back this response:&lt;br /&gt;
&amp;lt;pre&amp;gt;{&amp;quot;success&amp;quot;:false,&amp;quot;message&amp;quot;:&amp;quot;You must provide these parameters: please&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;MISSING_PARAMETERS&amp;quot;}&amp;lt;/pre&amp;gt;&lt;br /&gt;
...but if the client does visit /counter/value?please=lol or whatever, they&amp;#039;ll totally get the value back!  And remember, that value is session-specific - visiting the same URL in a different browser could get you a completely different number.&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s up to you to maintain whatever state you like in those session variables.  Obvious candidates are user information, and state about current high-traffic jobs that the user is engaged in (if they&amp;#039;re sending requests every second, you probably don&amp;#039;t want to hit the database more than is necessary).&lt;br /&gt;
&lt;br /&gt;
You can (and probably want to) have session state expire after a certain amount of time.  This function call will cause sessions to expire after 10 minutes of inactivity:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
router.setSessionInactivityTimeout(10, function(session) {&lt;br /&gt;
	console.log(&amp;quot;A user just timed out!  They got their counter up to &amp;quot; + session.counter + &amp;quot; first, though.&amp;quot;)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
But you probably want to have users log in before you do anything else, right?  Well, hold on to your pants, because model-router makes that easy too.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
router.route(&amp;#039;/authenticate&amp;#039;, function(parameters, session, next) {&lt;br /&gt;
	if (parameters.username === &amp;#039;duff&amp;#039; &amp;amp;&amp;amp; parameters.password === &amp;#039;butts123&amp;#039;) {&lt;br /&gt;
		session.username = &amp;#039;duff&amp;#039;&lt;br /&gt;
		next(&amp;quot;You&amp;#039;re logged in now!&amp;quot;)&lt;br /&gt;
	} else {&lt;br /&gt;
		next(new Error(&amp;#039;Invalid login!&amp;#039;))&lt;br /&gt;
	}&lt;br /&gt;
}, [&amp;#039;username&amp;#039;, &amp;#039;password&amp;#039;])&lt;br /&gt;
&lt;br /&gt;
router.setSessionAuthentication(function(parameters, session, next) {&lt;br /&gt;
	var logged_in = typeof session.username !== &amp;#039;undefined&amp;#039;&lt;br /&gt;
	next(logged_in)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We can now define routes that are only accessible to authenticated users:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
router.routeAuthenticated(&amp;#039;/counter/vip-value&amp;#039;, function(parameters, session, next) {&lt;br /&gt;
	next((session.counter || 0) * 10)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Try to visit /counter/vip-value without having authenticated, and you&amp;#039;ll see&lt;br /&gt;
&amp;lt;pre&amp;gt;{&amp;quot;success&amp;quot;:false,&amp;quot;message&amp;quot;:&amp;quot;You have to be authenticated to access /counter/vip-value&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;NOT_AUTHENTICATED&amp;quot;}&amp;lt;/pre&amp;gt;&lt;br /&gt;
...but visit it after authenticating, and you&amp;#039;ll see that your session&amp;#039;s magical incrementable value is much larger than it would otherwise appear!  Zoinks!&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_development/model-router&amp;diff=6491</id>
		<title>Web development/model-router</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_development/model-router&amp;diff=6491"/>
		<updated>2013-02-19T22:30:09Z</updated>

		<summary type="html">&lt;p&gt;Duff: moar&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;model-router does a few things that make writing data servers easier:&lt;br /&gt;
* Routing&lt;br /&gt;
* Session handling/state&lt;br /&gt;
* Wrapping up authentication&lt;br /&gt;
* Checking for parameters existence&lt;br /&gt;
&lt;br /&gt;
== Including ==&lt;br /&gt;
You could have multiple router-things if you wanted to - you know, in case you were running multiple sites from the same node.js server, or something - but for your purposes you&amp;#039;ll probably just want to instantiate one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Router = require(&amp;#039;model-router&amp;#039;)&lt;br /&gt;
var router = new Router()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It doesn&amp;#039;t launch any servers of its own, that would be rude.  You&amp;#039;ll want to create your own server in the usual way, and then tell model-router to handle it if appropriate.&lt;br /&gt;
&lt;br /&gt;
model-router only sends back JSON responses, and doesn&amp;#039;t do anything with static content out of the box, so if you want to serve HTML/JavaScript files or something, you&amp;#039;ll have to do it yourself:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
require(&amp;#039;http&amp;#039;).createServer(function(req, res) {&lt;br /&gt;
	var pathname = require(&amp;#039;url&amp;#039;).parse(req.url).pathname&lt;br /&gt;
	var match&lt;br /&gt;
	if (match = /^\/static(\/.*)$/.exec(pathname)) {&lt;br /&gt;
		require(&amp;#039;send&amp;#039;)(req, match[1]).root(&amp;#039;./static/&amp;#039;).pipe(res)&lt;br /&gt;
	} else {&lt;br /&gt;
		router.handleRequest(req, res)&lt;br /&gt;
	}&lt;br /&gt;
}).listen(8080)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Routing ==&lt;br /&gt;
All right, your server is running.  You want to add a new response to certain messages - so that requests to yourdomain.com/information/time would get the current server time back, or something dumb like that.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
router.route(&amp;#039;/information/time&amp;#039;, function(parameters, session, next) {&lt;br /&gt;
	next(new Date())&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Browsing to the URL should immediately get you back this response:&lt;br /&gt;
&amp;lt;pre&amp;gt;{&amp;quot;success&amp;quot;:true,&amp;quot;output&amp;quot;:&amp;quot;2013-02-19T22:00:56.507Z&amp;quot;}&amp;lt;/pre&amp;gt;&lt;br /&gt;
But let&amp;#039;s say that something bad happens on the server - maybe it&amp;#039;s an error if a client asks for the server time on a Sunday.  You could reflect that by rewriting the function like so:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
router.route(&amp;#039;/information/time&amp;#039;, function(parameters, session, next) {&lt;br /&gt;
	var date = new Date()&lt;br /&gt;
	if (date.getDay() === 0) {&lt;br /&gt;
		next(new Error(&amp;quot;Don&amp;#039;t bother me on Sunday!&amp;quot;))&lt;br /&gt;
	} else {&lt;br /&gt;
		next(date)&lt;br /&gt;
	}&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Visiting that same URL on a Sunday would get you this response instead:&lt;br /&gt;
&amp;lt;pre&amp;gt;{&amp;quot;success&amp;quot;:false,&amp;quot;message&amp;quot;:&amp;quot;Don&amp;#039;t bother me on Sunday!&amp;quot;}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In realistic scenarios, you&amp;#039;ll probably want to only respond with errors in the case of legitimate server errors, like a query failing or a missing file or something.&lt;br /&gt;
&lt;br /&gt;
== Session state ==&lt;br /&gt;
All right, so you can easily fling data back to the client.  Unbeknownst to you (before you read this sentence), it turns out that model-router also stores a session variable for each visitor (using a cookie that it sets on the client)!  You can set parameters on this object whenever you like, and access them again later:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
router.route(&amp;#039;/counter/increment&amp;#039;, function(parameters, session, next) {&lt;br /&gt;
	session.counter = (session.counter || 0) + 1&lt;br /&gt;
	next()&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
But now let&amp;#039;s say that you want to see the current value of that pointless counter!  But let&amp;#039;s use a new feature that I feel like telling you about: guaranteed parameters.  Like, you know, where a request is only valid if a certain value is provided?  You could do a bunch of input parsing, and check to see if certain values were defined or whatnot, but model-router handles some of that for you.&lt;br /&gt;
&lt;br /&gt;
Let&amp;#039;s only give back the current value if the user provides a parameter called &amp;quot;please&amp;quot; - we won&amp;#039;t even bother to check what it is, as long as it&amp;#039;s set:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
router.route(&amp;#039;/counter/value&amp;#039;, function(parameters, session, next) {&lt;br /&gt;
	next(session.counter || 0)&lt;br /&gt;
}, [&amp;#039;please&amp;#039;])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you don&amp;#039;t pass in a parameter with the request (either as part of the query string in the URL, or in the headers), you&amp;#039;ll get back this response:&lt;br /&gt;
&amp;lt;pre&amp;gt;{&amp;quot;success&amp;quot;:false,&amp;quot;message&amp;quot;:&amp;quot;You must provide these parameters: please&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;MISSING_PARAMETERS&amp;quot;}&amp;lt;/pre&amp;gt;&lt;br /&gt;
...but if the client does visit /counter/value?please=lol or whatever, they&amp;#039;ll totally get the value back!  And remember, that value is session-specific - visiting the same URL in a different browser could get you a completely different number.&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s up to you to maintain whatever state you like in those session variables.  Obvious candidates are user information, and state about current high-traffic jobs that the user is engaged in (if they&amp;#039;re sending requests every second, you probably don&amp;#039;t want to hit the database more than is necessary).&lt;br /&gt;
&lt;br /&gt;
You can (and probably want to) have session state expire after a certain amount of time.  This function call will cause sessions to expire after 10 minutes of inactivity:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
router.setSessionInactivityTimeout(10, function(session) {&lt;br /&gt;
	console.log(&amp;quot;A user just timed out!  They got their counter up to &amp;quot; + session.counter + &amp;quot; first, though.&amp;quot;)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_development/model-router&amp;diff=6490</id>
		<title>Web development/model-router</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_development/model-router&amp;diff=6490"/>
		<updated>2013-02-19T22:25:34Z</updated>

		<summary type="html">&lt;p&gt;Duff: moar&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;model-router does a few things that make writing data servers easier:&lt;br /&gt;
* Routing&lt;br /&gt;
* Session handling/state&lt;br /&gt;
* Wrapping up authentication&lt;br /&gt;
* Checking for parameters existence&lt;br /&gt;
&lt;br /&gt;
== Including ==&lt;br /&gt;
You could have multiple router-things if you wanted to - you know, in case you were running multiple sites from the same node.js server, or something - but for your purposes you&amp;#039;ll probably just want to instantiate one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Router = require(&amp;#039;model-router&amp;#039;)&lt;br /&gt;
var router = new Router()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It doesn&amp;#039;t launch any servers of its own, that would be rude.  You&amp;#039;ll want to create your own server in the usual way, and then tell model-router to handle it if appropriate.&lt;br /&gt;
&lt;br /&gt;
model-router only sends back JSON responses, and doesn&amp;#039;t do anything with static content out of the box, so if you want to serve HTML/JavaScript files or something, you&amp;#039;ll have to do it yourself:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
require(&amp;#039;http&amp;#039;).createServer(function(req, res) {&lt;br /&gt;
	var pathname = require(&amp;#039;url&amp;#039;).parse(req.url).pathname&lt;br /&gt;
	var match&lt;br /&gt;
	if (match = /^\/static(\/.*)$/.exec(pathname)) {&lt;br /&gt;
		require(&amp;#039;send&amp;#039;)(req, match[1]).root(&amp;#039;./static/&amp;#039;).pipe(res)&lt;br /&gt;
	} else {&lt;br /&gt;
		router.handleRequest(req, res)&lt;br /&gt;
	}&lt;br /&gt;
}).listen(8080)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Routing ==&lt;br /&gt;
All right, your server is running.  You want to add a new response to certain messages - so that requests to yourdomain.com/information/time would get the current server time back, or something dumb like that.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
router.route(&amp;#039;/information/time&amp;#039;, function(parameters, session, next) {&lt;br /&gt;
	next(new Date())&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Browsing to the URL should immediately get you back this response:&lt;br /&gt;
&amp;lt;pre&amp;gt;{&amp;quot;success&amp;quot;:true,&amp;quot;output&amp;quot;:&amp;quot;2013-02-19T22:00:56.507Z&amp;quot;}&amp;lt;/pre&amp;gt;&lt;br /&gt;
But let&amp;#039;s say that something bad happens on the server - maybe it&amp;#039;s an error if a client asks for the server time on a Sunday.  You could reflect that by rewriting the function like so:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
router.route(&amp;#039;/information/time&amp;#039;, function(parameters, session, next) {&lt;br /&gt;
	var date = new Date()&lt;br /&gt;
	if (date.getDay() === 0) {&lt;br /&gt;
		next(new Error(&amp;quot;Don&amp;#039;t bother me on Sunday!&amp;quot;))&lt;br /&gt;
	} else {&lt;br /&gt;
		next(date)&lt;br /&gt;
	}&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Visiting that same URL on a Sunday would get you this response instead:&lt;br /&gt;
&amp;lt;pre&amp;gt;{&amp;quot;success&amp;quot;:false,&amp;quot;message&amp;quot;:&amp;quot;Don&amp;#039;t bother me on Sunday!&amp;quot;}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In realistic scenarios, you&amp;#039;ll probably want to only respond with errors in the case of legitimate server errors, like a query failing or a missing file or something.&lt;br /&gt;
&lt;br /&gt;
== Session state ==&lt;br /&gt;
All right, so you can easily fling data back to the client.  Unbeknownst to you (before you read this sentence), it turns out that model-router also stores a session variable for each visitor (using a cookie that it sets on the client)!  You can set parameters on this object whenever you like, and access them again later:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
router.route(&amp;#039;/counter/increment&amp;#039;, function(parameters, session, next) {&lt;br /&gt;
	session.counter = (session.counter || 0) + 1&lt;br /&gt;
	next()&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
But now let&amp;#039;s say that you want to see the current value of that pointless counter!  But let&amp;#039;s use a new feature that I feel like telling you about: guaranteed parameters.  Like, you know, where a request is only valid if a certain value is provided?  You could do a bunch of input parsing, and check to see if certain values were defined or whatnot, but model-router handles some of that for you.&lt;br /&gt;
&lt;br /&gt;
Let&amp;#039;s only give back the current value if the user provides a parameter called &amp;quot;please&amp;quot; - we won&amp;#039;t even bother to check what it is, as long as it&amp;#039;s set:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
router.route(&amp;#039;/counter/value&amp;#039;, function(parameters, session, next) {&lt;br /&gt;
	next(session.counter || 0)&lt;br /&gt;
}, [&amp;#039;please&amp;#039;])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you don&amp;#039;t pass in a parameter with the request (either as part of the query string in the URL, or in the headers), you&amp;#039;ll get back this response:&lt;br /&gt;
&amp;lt;pre&amp;gt;{&amp;quot;success&amp;quot;:false,&amp;quot;message&amp;quot;:&amp;quot;You must provide these parameters: please&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;MISSING_PARAMETERS&amp;quot;}&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_development/model-router&amp;diff=6489</id>
		<title>Web development/model-router</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_development/model-router&amp;diff=6489"/>
		<updated>2013-02-19T21:58:40Z</updated>

		<summary type="html">&lt;p&gt;Duff: First stuff&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;model-router does a few things that make writing data servers easier:&lt;br /&gt;
* Routing&lt;br /&gt;
* Session handling/state&lt;br /&gt;
* Wrapping up authentication&lt;br /&gt;
* Checking for parameters existence&lt;br /&gt;
&lt;br /&gt;
== Including ==&lt;br /&gt;
You could have multiple router-things if you wanted to - you know, in case you were running multiple sites from the same node.js server, or something - but for your purposes you&amp;#039;ll probably just want to instantiate one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Router = require(&amp;#039;model-router&amp;#039;)&lt;br /&gt;
var router = new Router()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It doesn&amp;#039;t launch any servers of its own, that would be rude.  You&amp;#039;ll want to create your own server in the usual way, and then tell model-router to handle it if appropriate.&lt;br /&gt;
&lt;br /&gt;
model-router only sends back JSON responses, and doesn&amp;#039;t do anything with static content out of the box, so if you want to serve HTML/JavaScript files or something, you&amp;#039;ll have to do it yourself:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
require(&amp;#039;http&amp;#039;).createServer(function(req, res) {&lt;br /&gt;
	var pathname = require(&amp;#039;url&amp;#039;).parse(req.url).pathname&lt;br /&gt;
	var match&lt;br /&gt;
	if (match = /^\/static(\/.*)$/.exec(pathname)) {&lt;br /&gt;
		require(&amp;#039;send&amp;#039;)(req, match[1]).root(&amp;#039;./static/&amp;#039;).pipe(res)&lt;br /&gt;
	} else {&lt;br /&gt;
		router.handleRequest(req, res)&lt;br /&gt;
	}&lt;br /&gt;
}).listen(8080)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=ISoft_Data_Systems&amp;diff=6484</id>
		<title>ISoft Data Systems</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=ISoft_Data_Systems&amp;diff=6484"/>
		<updated>2013-02-19T15:54:16Z</updated>

		<summary type="html">&lt;p&gt;Duff: Reverted edits by AntoinetteRosa1970 (talk) to last revision by Codeman&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ISoft Data Systems is a software development company in Lincoln, Nebraska.  They specialize in custom web development and business management solutions for the recycling and salvage industries.&lt;br /&gt;
&lt;br /&gt;
[[Image:Turbine Flats from south side small.jpg|frame|ISoft Data Systems is located in the Turbine Flats Building.]]&lt;br /&gt;
&lt;br /&gt;
== Address ==&lt;br /&gt;
2124 Y Street Flat 201 &amp;lt;br&amp;gt;&lt;br /&gt;
Lincoln, NE 68503&lt;br /&gt;
&lt;br /&gt;
==Chat==&lt;br /&gt;
(8am - ~7pm [http://en.wikipedia.org/wiki/Central_Time_Zone_(North_America) Central]) Call or email us and we will help you set up a chat account so you can easily contact us whenever you like!&lt;br /&gt;
&lt;br /&gt;
==Email==&lt;br /&gt;
* ITrack Support: [mailto:support@isoftdata.com?Subject=ITrack%20Support%20Question support@isoftdata.com]&lt;br /&gt;
* HeavyTruckParts.net Support: [mailto:support@heavytruckparts.net?Subject=Heavy%20Truck%20Parts%20Support%20Question support@heavytruckparts.net]&lt;br /&gt;
&lt;br /&gt;
==Phone Numbers==&lt;br /&gt;
* Toll free phone: 800-929-1829 (8am - 6pm Central)&lt;br /&gt;
* Nebraska phone: 402-435-3850 (8am - 6pm Central)&lt;br /&gt;
* Fax: 402-435-7076&lt;br /&gt;
&lt;br /&gt;
==Departments==&lt;br /&gt;
Those numbers there are our extension numbers!&lt;br /&gt;
&lt;br /&gt;
===Tech Support===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;201 - All Support&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** 110 - [[Cody Hanson]]&lt;br /&gt;
** 102 - [[Dayton Lowell]]&lt;br /&gt;
** 107 - [[Justin Wheeler]]&lt;br /&gt;
** 108 - [[Mark Hardisty]]&lt;br /&gt;
** 118 - [[Jordan Bonge]]&lt;br /&gt;
&lt;br /&gt;
=== Management ===&lt;br /&gt;
* 103 - [[Brendan Evans]] (Sales)&lt;br /&gt;
* 100 - [[Emily Lowell]]&lt;br /&gt;
* 101 - [[Matthew Wegener]]&lt;br /&gt;
** 301 - Voicemail&lt;br /&gt;
* 111 - [[Tony Merritt]]&lt;br /&gt;
* 203 - [[Umeda Islamova]]&lt;br /&gt;
&lt;br /&gt;
=== Application Development ===&lt;br /&gt;
* 105 - [[Dillon Sadofsky]]&lt;br /&gt;
* 104 - [[Josh Duff]]&lt;br /&gt;
* 115 - [[Justin McKinstry]]&lt;br /&gt;
* [[Svyatoslav Voznyuk]]&lt;br /&gt;
&lt;br /&gt;
=== Web Development ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;202 - All web development&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** 114 - [[Amos Sterns]]&lt;br /&gt;
** 112 - [[Andrew Johnson]]&lt;br /&gt;
** 113 - [[Brian Roy]]&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
[[:Category:ISoft Employees|ISoft Employees]]&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Presage/Barcodes&amp;diff=6440</id>
		<title>Presage/Barcodes</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Presage/Barcodes&amp;diff=6440"/>
		<updated>2013-01-24T23:18:19Z</updated>

		<summary type="html">&lt;p&gt;Duff: First barcodes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Barcodes in Presage:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Object&lt;br /&gt;
! Barcode contents&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Sample&lt;br /&gt;
| S[sampleid]&lt;br /&gt;
| Used in barcodes where the users will not be changing the sample&amp;#039;s tag number&lt;br /&gt;
|-&lt;br /&gt;
| Work order&lt;br /&gt;
| W[workorderid]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Physical sample (bag)&lt;br /&gt;
| T[tagnumber]&lt;br /&gt;
| Identifies a sample to be submitted to multiple analyses.  Is not globally unique, must be paired with a Work Order.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Image_Naming_Conventions_(Pro)&amp;diff=6394</id>
		<title>Image Naming Conventions (Pro)</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Image_Naming_Conventions_(Pro)&amp;diff=6394"/>
		<updated>2013-01-04T17:58:38Z</updated>

		<summary type="html">&lt;p&gt;Duff: Redirects to redirects are bad&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[ITrack/Pro/Image Naming Conventions]]&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_development/CatHerder&amp;diff=6378</id>
		<title>Web development/CatHerder</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_development/CatHerder&amp;diff=6378"/>
		<updated>2012-12-29T20:25:28Z</updated>

		<summary type="html">&lt;p&gt;Duff: More data&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The CatHerder framework is the equivalent of ITrack&amp;#039;s [[ITrack/Master|Master]] extension loader.  It started out handling authentication and the menu for passing users from screen to screen, but is now product-agnostic and can be used to load any arbitrary JavaScript extensions which may or may not have views.&lt;br /&gt;
&lt;br /&gt;
These extensions have two components: a controller and a view (though the view is optional!).  This springs from my initial assumption of how a reasonable client-side code structure might look, and my experience writing MVC code on the server.&lt;br /&gt;
&lt;br /&gt;
In practice, this has not quite sufficient.  Currently, most of the extensions that represent screens juggle what we would probably call a &amp;quot;document&amp;quot; inside of the controller, with the view containing some logic and containing the functions that update the DOM when the document&amp;#039;s state changes, with the controller doing everything else.&lt;br /&gt;
&lt;br /&gt;
Moving forward, I foresee there being some sort of document object that receives new data from user scans or user interaction in the view, handles communicating the data back and forth with the server, and gives the view hookups that fire whenever there is updated data to be changed in the display.&lt;br /&gt;
&lt;br /&gt;
Right now, all that stuff has been going in the controllers.  In the future, I see the controllers evolving to become simply the part of the extension that is exposed to other extensions.  At the moment they are that, but also all the document-juggling,&lt;br /&gt;
&lt;br /&gt;
But enough of my blathering, let&amp;#039;s blither over some examples.&lt;br /&gt;
&lt;br /&gt;
== Launching the app ==&lt;br /&gt;
It used to be slightly more complicated, but now it&amp;#039;s not.  In body onload or $(document).ready() or whatever, just call the catHerder function, passing an array containing strings of extension names.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
catHerder([&lt;br /&gt;
	&amp;#039;DeviceRegistration&amp;#039;,&lt;br /&gt;
	&amp;#039;Login&amp;#039;,&lt;br /&gt;
	&amp;#039;MainMenu&amp;#039;,&lt;br /&gt;
	&amp;#039;InventoryCount&amp;#039;&lt;br /&gt;
	])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A new div is created in the body, and the specified extensions will be loaded and initialized in the order that they are found in the array.  Once all extensions are initialized, the first one in the array will be shown.&lt;br /&gt;
&lt;br /&gt;
== Making a new extension ==&lt;br /&gt;
To make a new extension, you just need a function named whatever you want the extension&amp;#039;s name to be - that&amp;#039;s your controller.  If the extension has a view, create a second function with the same name as the controller, but with &amp;quot;View&amp;quot; at the end of the name. 8-|&lt;br /&gt;
&lt;br /&gt;
You can create these functions in your controller, and they will be automatically called at the appropriate time (you shouldn&amp;#039;t call them yourself):&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;onCreate&amp;#039;&amp;#039;&amp;#039; - called after the extension has been constructed (obviously), but also after the view has been constructed, and the prototypes and event emitter functions are in place.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;onAllExtensionsCreated&amp;#039;&amp;#039;&amp;#039; - called after every extension has been initialized (and after onCreate has been called on them all).  This is where you would attach your event handlers to other extensions.&lt;br /&gt;
&lt;br /&gt;
Beyond those functions, you can also implement onShow, onHide, and onClose.  They will be called whenever the show, hide, or close functions (which every controller has via the prototype object) are called.&lt;br /&gt;
&lt;br /&gt;
These functions are optional, and you don&amp;#039;t have to implement any of them - they are called using the callFunctionIfExists function that the controller prototype has.  You can call optional functions on other extensions to by using the same function, but you probably don&amp;#039;t want to, because you probably want to use...&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
Extensions are event emitters (via [https://github.com/bentomas/smokesignals smokesignals])!  The closest equivalent in the ITrack framework is the inter-DLL messages.&lt;br /&gt;
&lt;br /&gt;
Generally speaking, events should emit events on themselves, and other extensions should subscribe to those events by adding a handler to that extension.&lt;br /&gt;
&lt;br /&gt;
Some events are emitted automatically by the extension prototype&amp;#039;s functions - namely &amp;quot;shown&amp;quot;, &amp;quot;hidden&amp;quot;, and &amp;quot;closed&amp;quot;.  In the case of those events, the parameter passed along to the event&amp;#039;s subscribers is the extension itself.&lt;br /&gt;
&lt;br /&gt;
But wait, to subscribe to an event on an extension, you need to be able to access it!  How do you reference other extensions?  You use...&lt;br /&gt;
&lt;br /&gt;
== Shared framework functions ==&lt;br /&gt;
How extensions access the world beyond their view!&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;catHerder.getLastShownExtension()&amp;#039;&amp;#039;&amp;#039; - probably pretty self explanatory, eh?  The coordinator keeps track of every &amp;quot;shown&amp;quot; event emitted by all extensions, and returns whichever the last shown extension was when this function is called.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;catHerder.getExtension(extension_name)&amp;#039;&amp;#039;&amp;#039; - grabs the extension that was instantiated by the coordinator when the catHerder function was originally called.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;catHerder.instantiateExtension(extension_name)&amp;#039;&amp;#039;&amp;#039; - that&amp;#039;s right, instantiating new extensions isn&amp;#039;t just just for the coordinator!&lt;br /&gt;
&lt;br /&gt;
At this point, I should stop and explain.  I did make it possible for extensions to summon up new instances of other extensions.  At the moment this is primarily used in places that want to have their own version of the &amp;quot;Menu&amp;quot; or &amp;quot;UserInput&amp;quot; extensions.&lt;br /&gt;
&lt;br /&gt;
I&amp;#039;m not sure if I want to keep this paradigm - I suspect that eventually it might be best to just have a standard for calling extensions for one-time use.  Still, I&amp;#039;m not yet sure how else to handle the sort of subclassing that currently happens between the MainMenu and Menu extensions.&lt;br /&gt;
&lt;br /&gt;
Anyway, the point is - currently there are two classes of extensions: the ones instantiated by the coordinator itself, and the ones instantiated by other extensions at some point.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;catHerder.onExtension(extension_name, event, callback)&amp;#039;&amp;#039;&amp;#039; - this attaches an event handler to *all* currently existing extensions of the given name.  This is not the general case - the general case is to attach event handlers to the one version of the extension that was originally instantiated by the coordinator, using &amp;#039;&amp;#039;&amp;#039;catHerder.getExtension(extension_name).on(event, callback)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;catHerder.showNextExtension()&amp;#039;&amp;#039;&amp;#039; - you generally won&amp;#039;t need to call this, since it is called automatically whenever an extension is closed.  The extension that will be shown is decided like so:&lt;br /&gt;
*# If a &amp;quot;next extension&amp;quot; has been set, it is shown.  That extension is then forgotten, and showNextExtension will continue with its normal behavior the next time it is called.&lt;br /&gt;
*# If a &amp;quot;default next extension&amp;quot; has been set, it is shown.&lt;br /&gt;
*# Otherwise, the coordinator proceeds through the extension list in the order the extensions were loaded.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;catHerder.setDefaultNextExtension(extension)&amp;#039;&amp;#039;&amp;#039; - right now, the LXW menu screen calls &amp;#039;&amp;#039;catHerder.setDefaultNextExtension(this)&amp;#039;&amp;#039; as soon as it first gets shown.  This makes it so that by default, whenever an extension is closed, the user is sent back to the menu.  Pass in null to reset this value.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;catHerder.setNextExtension(extension)&amp;#039;&amp;#039;&amp;#039; - the extension passed in will be shown next... just once!&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_development/CatHerder&amp;diff=6377</id>
		<title>Web development/CatHerder</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_development/CatHerder&amp;diff=6377"/>
		<updated>2012-12-29T19:10:12Z</updated>

		<summary type="html">&lt;p&gt;Duff: Getting started&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The CatHerder framework is the equivalent of ITrack&amp;#039;s [[ITrack/Master|Master]] extension loader.  It started out handling authentication and the menu for passing users from screen to screen, but is now product-agnostic and can be used to load any arbitrary JavaScript extensions which may or may not have views.&lt;br /&gt;
&lt;br /&gt;
These extensions have two components: a controller and a view (though the view is optional!).  This springs from my initial assumption of how a reasonable client-side code structure might look, and my experience writing MVC code on the server.&lt;br /&gt;
&lt;br /&gt;
In practice, this has not quite sufficient.  Currently, most of the extensions that represent screens juggle what we would probably call a &amp;quot;document&amp;quot; inside of the controller, with the view containing some logic and containing the functions that update the DOM when the document&amp;#039;s state changes, with the controller doing everything else.&lt;br /&gt;
&lt;br /&gt;
Moving forward, I foresee there being some sort of document object that receives new data from user scans or user interaction in the view, handles communicating the data back and forth with the server, and gives the view hookups that fire whenever there is updated data to be changed in the display.&lt;br /&gt;
&lt;br /&gt;
Right now, all that stuff has been going in the controllers.  In the future, I see the controllers evolving to become simply the part of the extension that is exposed to other extensions.  At the moment they are that, but also all the document-juggling,&lt;br /&gt;
&lt;br /&gt;
But enough of my blathering, let&amp;#039;s blither over some examples.&lt;br /&gt;
&lt;br /&gt;
== Launching the app ==&lt;br /&gt;
It used to be slightly more complicated, but now it&amp;#039;s not.  In body onload or $(document).ready() or whatever, just call the catHerder function, passing an array containing strings of extension names.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
catHerder([&lt;br /&gt;
	&amp;#039;DeviceRegistration&amp;#039;,&lt;br /&gt;
	&amp;#039;Login&amp;#039;,&lt;br /&gt;
	&amp;#039;MainMenu&amp;#039;,&lt;br /&gt;
	&amp;#039;InventoryCount&amp;#039;&lt;br /&gt;
	])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Extensions will be loaded and initialized in the order that they are found in the array.  Once all extensions are initialized, the first one in the array will be shown.&lt;br /&gt;
&lt;br /&gt;
== Making a new extension ==&lt;br /&gt;
To make a new extension, you just need a function named whatever you want the extension&amp;#039;s name to be - that&amp;#039;s your controller.  If the extension has a view, create a second function with the same name as the controller, but with &amp;quot;View&amp;quot; at the end of the name.&lt;br /&gt;
&lt;br /&gt;
Extensions are event emitters (via [https://github.com/bentomas/smokesignals smokesignals]) -&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_development&amp;diff=6376</id>
		<title>Web development</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_development&amp;diff=6376"/>
		<updated>2012-12-29T18:40:53Z</updated>

		<summary type="html">&lt;p&gt;Duff: Initial page with redlinks for CatHerder and model-router&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Development on various mobile web development projects has necessitated some new tools!  Tools that need to be documented!  I will try to do so here.&lt;br /&gt;
&lt;br /&gt;
The equivalent of ITrack&amp;#039;s [[ITrack/Master|Master]]/[[ITrack/Extension|Extension]] framework is the [[Web development/CatHerder|CatHerder]].&lt;br /&gt;
&lt;br /&gt;
While [[ITrack/Enterprise/LXW|ITrack LXW]] uses a stateless PHP back-end, we also have the [[Web development/model-router|model-router]] for quickly building servers that can sling data back and forth with our webapps.&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=ITrack/Extension&amp;diff=6375</id>
		<title>ITrack/Extension</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=ITrack/Extension&amp;diff=6375"/>
		<updated>2012-12-29T18:37:09Z</updated>

		<summary type="html">&lt;p&gt;Duff: Fixing redirect link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In ITrack lingo, an extension is a general name for a DLL (dynamically loaded library) that can be loaded into [[ITrack/Master|ITrack.exe]].  This implies a certain conformation to ITrack standards and APIs.  These extensions are located in the installation directory (normally: C:\Program Files\ISoft Data Systems\[Product Name]) with ITrack.exe.  In order for Master to load an extension, it must be specified in its [[Configuration File]].&lt;br /&gt;
&lt;br /&gt;
==Extension Types==&lt;br /&gt;
Extensions all conform to the same standards, but fall into one of several logical categories depending on their purpose in ITrack:&lt;br /&gt;
* [[Module Extensions]]&lt;br /&gt;
* [[Utility Extensions]]&lt;br /&gt;
* [[Third Party Extensions]]&lt;br /&gt;
* [[User Created Extensions]]&lt;br /&gt;
* [[Database Connection Extensions]]&lt;br /&gt;
&lt;br /&gt;
==Extension Features==&lt;br /&gt;
Extensions can have some or all of the following features included in them; though the presence or absence of some of these features might change its &amp;#039;extension type&amp;#039;.&lt;br /&gt;
* [[Menu|Menu Options]] displayed at the top of Master&lt;br /&gt;
* [[Module|Modules]] displayed in the &amp;quot;Main Menu&amp;quot; in Master.&lt;br /&gt;
* [[Database Connection|Database Connections]] used for connecting to a [[Database]].&lt;br /&gt;
* [[Extension Function|Extension Functions]] used by other extensions and modules.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
* [[ITrack/Creating_an_Extension|Creating an Extension]]&lt;br /&gt;
&lt;br /&gt;
[[Category:ITrack]]&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=ITrack/IDispatch_error_522&amp;diff=6325</id>
		<title>ITrack/IDispatch error 522</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=ITrack/IDispatch_error_522&amp;diff=6325"/>
		<updated>2012-12-22T00:16:48Z</updated>

		<summary type="html">&lt;p&gt;Duff: Minor formatting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:IDispatch Error 522.png]]&lt;br /&gt;
&lt;br /&gt;
== Cause ==&lt;br /&gt;
This error occurs because the directory path listed in the QuickBooks Toolkit in ITrack Pro must be the same as what was opened when the user opened QuickBooks.&lt;br /&gt;
&lt;br /&gt;
== Solution ==&lt;br /&gt;
Try using a mapped network drive to the QuickBooks company file instead of the direct path (or vice versa).&lt;br /&gt;
&lt;br /&gt;
For example, if the the QuickBooks Toolkit has the path listed as: &amp;#039;&amp;#039;&amp;#039;\\server\QuickBooks\CompanyFile.qbw&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Try using something like this instead: &amp;#039;&amp;#039;&amp;#039;Z:\QuickBooks\CompanyFile.qbw&amp;#039;&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=ITrack/Pro/Part_Configuration_Screen&amp;diff=6313</id>
		<title>ITrack/Pro/Part Configuration Screen</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=ITrack/Pro/Part_Configuration_Screen&amp;diff=6313"/>
		<updated>2012-12-19T16:52:02Z</updated>

		<summary type="html">&lt;p&gt;Duff: /* Selecting Parts for Drop Down Lists */ Fixing some broken links to other manual pages&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Pro_Part_Config_Screen_1.png|thumb|right|600px|Parts Configuration Screen]]&lt;br /&gt;
==Selecting Parts for Drop Down Lists==&lt;br /&gt;
The Part Configuration Screen allows you to decide which parts will show up in the drop down lists on the [[ITrack/Pro/Parts Screen|Part Management Screen]] and the [[ITrack/Pro/Search Screen|Search Screen]].&lt;br /&gt;
&lt;br /&gt;
Click on Part Configuration in the Main Menu to open the Part Configuration Screen.  Make sure the Parts List tab is selected.  When you first install ITrack, all the parts will be checked.  You can choose to disable parts from the list that are infrequently or never used.&lt;br /&gt;
Now, when you enter or search for a part, only the parts you have checked will be displayed.  On the previous page, we unchecked hood hinge.  The image below shows the Search Screen and the hood hinge is now gone.&lt;br /&gt;
&lt;br /&gt;
==Adding, Editing, or Removing Parts==&lt;br /&gt;
The Parts List tab also allows you to add, edit, or remove parts.  On the bottom of the screen you will see these buttons.&lt;br /&gt;
It is important to remember there is a difference between removing and disabling a part.  &lt;br /&gt;
To remove a part, click on that part and click Remove.  If you ever want the part back, you must add it into ITrack.  &lt;br /&gt;
Disabling a part is when you uncheck the box  next to the name of the part.  The part will still appear in the Parts List but will not show up when you are entering parts.&lt;br /&gt;
&lt;br /&gt;
Clicking the Add button brings up the Add New Part Type box.  From here, you can enter in information about a part.  When you are satisfied with your new part, click the OK button.&lt;br /&gt;
&lt;br /&gt;
The More fields are very useful.  For some parts, ITrack already has the more fields filled out.  You can always change what the More fields contain, whether they were filled out by ITrack or blank. &lt;br /&gt;
&lt;br /&gt;
After entering information into the More fields, they will show up on the Part Management Screen.&lt;br /&gt;
&lt;br /&gt;
To edit an existing part, click on the part you wish to edit and then click the Edit button and the Edit Part Type box will appear.  Make any changes to the part and click OK when you are done.  &lt;br /&gt;
&lt;br /&gt;
If you want to delete a part from the Parts List, click on the part and then click the Remove button.  When you click Remove you will get one of two different messages.  You may get a dialog box asking you to confirm that you want to delete a part or you may get a message that the part you want to delete is in inventory.  If a part is in your inventory, you cannot delete it.&lt;br /&gt;
[[Image:Pro_PartConfig_Questions_1.png|thumb|left|500px|Parts Configuration Questions Screen]]&lt;br /&gt;
&lt;br /&gt;
==Part Questions==&lt;br /&gt;
Part Questions allows you to create questions that will be asked about specific parts when   you enter them in your inventory.  This allows you to have specific information about every part type that is entered.&lt;br /&gt;
To create a part question, first select a part by clicking on it in the Parts List tab.  Next, click the Edit Part Questions button in the lower right corner.  This brings up the Questions dialog box.&lt;br /&gt;
&lt;br /&gt;
Now, click the Add button to create a question.  You can add as many questions as you would like.  Click on a question and then click the Move Down or Move Up buttons to change the order of your questions.  You may want more important questions towards the top of your list.&lt;br /&gt;
&lt;br /&gt;
When you are finished creating questions for a part, click the OK button to save.&lt;br /&gt;
Once your questions are saved they will show up in the Part Management Screen.  When you enter the part that has these questions, the questions will show up in the [[:File:Pro_PartConifig_Q&amp;amp;AScreen_1.png|Q And A tab]].&lt;br /&gt;
&lt;br /&gt;
Click in the Value field to type in the answer to you question.  Now, when your sales people look up parts, they can have access to this valuable and more detailed information about the part.&lt;br /&gt;
&lt;br /&gt;
==Part Manufacturers &amp;amp; Models==&lt;br /&gt;
From the Part models tab you can add and edit part manufacturers and models.&lt;br /&gt;
&lt;br /&gt;
===Adding New Manufacturer or Model===&lt;br /&gt;
{{Tip| You can also add Part manufacturers and models directly from the Parts screen by click the Add button or pressing Alt+d}}&lt;br /&gt;
# Click the &amp;#039;&amp;#039;&amp;#039;Add model&amp;#039;&amp;#039;&amp;#039; button&lt;br /&gt;
# If your creating both a new manufacturer and model, check the &amp;#039;&amp;#039;&amp;#039;Create new manufacturer&amp;#039;&amp;#039;&amp;#039; checkbox.&lt;br /&gt;
# The existing manufacturers dropdown will disappear and a new field will appear directly below the checkbox where you can type in the new manufacturer name.&lt;br /&gt;
# Fill in the remaining fields in the dialog to create the new manufacturer and model.&lt;br /&gt;
&lt;br /&gt;
{{Tip|Manufacturers that appear at the bottom of the manufacturers list and whose text appears in a shade of gray have no models for that part type.  Note that Part manufacturers are not per part type(they&amp;#039;re global) but part models are per part type}}&lt;br /&gt;
&lt;br /&gt;
===Edit Manufacturer or Model===&lt;br /&gt;
# Select the Part type from the dropdown on the &amp;#039;&amp;#039;&amp;#039;Part models&amp;#039;&amp;#039;&amp;#039; tab&lt;br /&gt;
# Click the manufacturer you want to edit&lt;br /&gt;
# You&amp;#039;ll notice the manufacturer field is editable, you can type in this field to rename Manufacturers&lt;br /&gt;
# Once you select a manufacturer the corresponding models will appear in the pane on the right&lt;br /&gt;
# Clicking any of the fields on the &amp;#039;&amp;#039;&amp;#039;Models&amp;#039;&amp;#039;&amp;#039; pane will cause the field to become editable, inline.&lt;br /&gt;
# Default pricing is configured per model and can be configured (once a model is selected) in the bottom right pane(also inline editing).&lt;br /&gt;
&lt;br /&gt;
{{Tip|If you are having trouble finding the manufacturer in the Part Management Screen once you have edited it in the Part Configuration Screen, then try setting the &amp;#039;&amp;#039;&amp;#039;First Year&amp;#039;&amp;#039;&amp;#039; field to zero and the &amp;#039;&amp;#039;&amp;#039;Last Year&amp;#039;&amp;#039;&amp;#039; to 9999}}&lt;br /&gt;
&lt;br /&gt;
[[Category:ITrack/Pro/Extensions]]&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=ITrack/Pro/Part_Configuration_Screen&amp;diff=6312</id>
		<title>ITrack/Pro/Part Configuration Screen</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=ITrack/Pro/Part_Configuration_Screen&amp;diff=6312"/>
		<updated>2012-12-19T16:48:12Z</updated>

		<summary type="html">&lt;p&gt;Duff: /* Part Questions */ Fixing internal wiki link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Pro_Part_Config_Screen_1.png|thumb|right|600px|Parts Configuration Screen]]&lt;br /&gt;
==Selecting Parts for Drop Down Lists==&lt;br /&gt;
The Part Configuration Screen allows you to decide which parts will show up in the drop down lists on the [[Parts Screen (Pro)|Part Management]] Screen and the [[Search Screen (Pro)|Search]] Screen.    &lt;br /&gt;
&lt;br /&gt;
Click on Part Configuration in the Main Menu to open the Part Configuration Screen.  Make sure the Parts List tab is selected.  When you first install ITrack, all the parts will be checked.  You can choose to disable parts from the list that are infrequently or never used.&lt;br /&gt;
Now, when you enter or search for a part, only the parts you have checked will be displayed.  On the previous page, we unchecked hood hinge.  The image below shows the [[Search Screen (Pro)|Search]] Screen and the hood hinge is now gone.&lt;br /&gt;
==Adding, Editing, or Removing Parts==&lt;br /&gt;
The Parts List tab also allows you to add, edit, or remove parts.  On the bottom of the screen you will see these buttons.&lt;br /&gt;
It is important to remember there is a difference between removing and disabling a part.  &lt;br /&gt;
To remove a part, click on that part and click Remove.  If you ever want the part back, you must add it into ITrack.  &lt;br /&gt;
Disabling a part is when you uncheck the box  next to the name of the part.  The part will still appear in the Parts List but will not show up when you are entering parts.&lt;br /&gt;
&lt;br /&gt;
Clicking the Add button brings up the Add New Part Type box.  From here, you can enter in information about a part.  When you are satisfied with your new part, click the OK button.&lt;br /&gt;
&lt;br /&gt;
The More fields are very useful.  For some parts, ITrack already has the more fields filled out.  You can always change what the More fields contain, whether they were filled out by ITrack or blank. &lt;br /&gt;
&lt;br /&gt;
After entering information into the More fields, they will show up on the Part Management Screen.&lt;br /&gt;
&lt;br /&gt;
To edit an existing part, click on the part you wish to edit and then click the Edit button and the Edit Part Type box will appear.  Make any changes to the part and click OK when you are done.  &lt;br /&gt;
&lt;br /&gt;
If you want to delete a part from the Parts List, click on the part and then click the Remove button.  When you click Remove you will get one of two different messages.  You may get a dialog box asking you to confirm that you want to delete a part or you may get a message that the part you want to delete is in inventory.  If a part is in your inventory, you cannot delete it.&lt;br /&gt;
[[Image:Pro_PartConfig_Questions_1.png|thumb|left|500px|Parts Configuration Questions Screen]]&lt;br /&gt;
&lt;br /&gt;
==Part Questions==&lt;br /&gt;
Part Questions allows you to create questions that will be asked about specific parts when   you enter them in your inventory.  This allows you to have specific information about every part type that is entered.&lt;br /&gt;
To create a part question, first select a part by clicking on it in the Parts List tab.  Next, click the Edit Part Questions button in the lower right corner.  This brings up the Questions dialog box.&lt;br /&gt;
&lt;br /&gt;
Now, click the Add button to create a question.  You can add as many questions as you would like.  Click on a question and then click the Move Down or Move Up buttons to change the order of your questions.  You may want more important questions towards the top of your list.&lt;br /&gt;
&lt;br /&gt;
When you are finished creating questions for a part, click the OK button to save.&lt;br /&gt;
Once your questions are saved they will show up in the Part Management Screen.  When you enter the part that has these questions, the questions will show up in the [[:File:Pro_PartConifig_Q&amp;amp;AScreen_1.png|Q And A tab]].&lt;br /&gt;
&lt;br /&gt;
Click in the Value field to type in the answer to you question.  Now, when your sales people look up parts, they can have access to this valuable and more detailed information about the part.&lt;br /&gt;
&lt;br /&gt;
==Part Manufacturers &amp;amp; Models==&lt;br /&gt;
From the Part models tab you can add and edit part manufacturers and models.&lt;br /&gt;
&lt;br /&gt;
===Adding New Manufacturer or Model===&lt;br /&gt;
{{Tip| You can also add Part manufacturers and models directly from the Parts screen by click the Add button or pressing Alt+d}}&lt;br /&gt;
# Click the &amp;#039;&amp;#039;&amp;#039;Add model&amp;#039;&amp;#039;&amp;#039; button&lt;br /&gt;
# If your creating both a new manufacturer and model, check the &amp;#039;&amp;#039;&amp;#039;Create new manufacturer&amp;#039;&amp;#039;&amp;#039; checkbox.&lt;br /&gt;
# The existing manufacturers dropdown will disappear and a new field will appear directly below the checkbox where you can type in the new manufacturer name.&lt;br /&gt;
# Fill in the remaining fields in the dialog to create the new manufacturer and model.&lt;br /&gt;
&lt;br /&gt;
{{Tip|Manufacturers that appear at the bottom of the manufacturers list and whose text appears in a shade of gray have no models for that part type.  Note that Part manufacturers are not per part type(they&amp;#039;re global) but part models are per part type}}&lt;br /&gt;
&lt;br /&gt;
===Edit Manufacturer or Model===&lt;br /&gt;
# Select the Part type from the dropdown on the &amp;#039;&amp;#039;&amp;#039;Part models&amp;#039;&amp;#039;&amp;#039; tab&lt;br /&gt;
# Click the manufacturer you want to edit&lt;br /&gt;
# You&amp;#039;ll notice the manufacturer field is editable, you can type in this field to rename Manufacturers&lt;br /&gt;
# Once you select a manufacturer the corresponding models will appear in the pane on the right&lt;br /&gt;
# Clicking any of the fields on the &amp;#039;&amp;#039;&amp;#039;Models&amp;#039;&amp;#039;&amp;#039; pane will cause the field to become editable, inline.&lt;br /&gt;
# Default pricing is configured per model and can be configured (once a model is selected) in the bottom right pane(also inline editing).&lt;br /&gt;
&lt;br /&gt;
{{Tip|If you are having trouble finding the manufacturer in the Part Management Screen once you have edited it in the Part Configuration Screen, then try setting the &amp;#039;&amp;#039;&amp;#039;First Year&amp;#039;&amp;#039;&amp;#039; field to zero and the &amp;#039;&amp;#039;&amp;#039;Last Year&amp;#039;&amp;#039;&amp;#039; to 9999}}&lt;br /&gt;
&lt;br /&gt;
[[Category:ITrack/Pro/Extensions]]&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=ITrack/Enterprise/LXW&amp;diff=6257</id>
		<title>ITrack/Enterprise/LXW</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=ITrack/Enterprise/LXW&amp;diff=6257"/>
		<updated>2012-11-28T21:39:10Z</updated>

		<summary type="html">&lt;p&gt;Duff: /* Picking */ Clarifying a bit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The mobile version of ITrack, for running warehouses with scanners!&lt;br /&gt;
&lt;br /&gt;
== Picking ==&lt;br /&gt;
# Scan a sales order barcode (on a picking label)&lt;br /&gt;
# Scan a part&lt;br /&gt;
# Scan the source location where you found the part&lt;br /&gt;
## If the location is not one of the locations where the part was currently allocated from, you will need to select the allocation location that you are picking the part for&lt;br /&gt;
# Scan a destination location (if you want to, otherwise you can close the screen or scan a new sales order)&lt;br /&gt;
&lt;br /&gt;
The part gets marked as picked in the delivery system, and gets moved to the destination location.  If you don&amp;#039;t specify a destination location, it uses the default, which is set in the store settings.&lt;br /&gt;
&lt;br /&gt;
== Inventory move ==&lt;br /&gt;
# Scan a location&lt;br /&gt;
# Scan any number of parts at the location&lt;br /&gt;
# Scan a destination location&lt;br /&gt;
&lt;br /&gt;
All the parts you scanned get moved!&lt;br /&gt;
&lt;br /&gt;
== Inventory Detail ==&lt;br /&gt;
Scan any part to see information about it!&lt;br /&gt;
&lt;br /&gt;
== Inventory Count ==&lt;br /&gt;
# Scan a location&lt;br /&gt;
# Scan all the parts at that location&lt;br /&gt;
# Scan a new location to count at, or close the screen&lt;br /&gt;
&lt;br /&gt;
All of the parts that you found at that location are moved there, if necessary.  All parts that should have been found there, but weren&amp;#039;t, get moved to the Variance location!&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=ITrack/Enterprise/LXW&amp;diff=6245</id>
		<title>ITrack/Enterprise/LXW</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=ITrack/Enterprise/LXW&amp;diff=6245"/>
		<updated>2012-11-27T20:44:25Z</updated>

		<summary type="html">&lt;p&gt;Duff: /* Picking */ Fixed so that it wasn&amp;#039;t a pack of lies&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The mobile version of ITrack, for running warehouses with scanners!&lt;br /&gt;
&lt;br /&gt;
== Picking ==&lt;br /&gt;
# Scan a sales order&lt;br /&gt;
# Scan a part&lt;br /&gt;
# Scan the location you found the part&lt;br /&gt;
## If the location is not one of the locations where the part was currently allocated from, you will need to select the location that you are picking the part for&lt;br /&gt;
# Scan a destination location (if you want to, otherwise you can close the screen or scan a new sales order)&lt;br /&gt;
&lt;br /&gt;
The part gets marked as picked in the delivery system, and gets moved to the destination location.  If you don&amp;#039;t specify a destination location, it uses the default, which is set in the store settings.&lt;br /&gt;
&lt;br /&gt;
== Inventory move ==&lt;br /&gt;
# Scan a location&lt;br /&gt;
# Scan any number of parts at the location&lt;br /&gt;
# Scan a destination location&lt;br /&gt;
&lt;br /&gt;
All the parts you scanned get moved!&lt;br /&gt;
&lt;br /&gt;
== Inventory Detail ==&lt;br /&gt;
Scan any part to see information about it!&lt;br /&gt;
&lt;br /&gt;
== Inventory Count ==&lt;br /&gt;
# Scan a location&lt;br /&gt;
# Scan all the parts at that location&lt;br /&gt;
# Scan a new location to count at, or close the screen&lt;br /&gt;
&lt;br /&gt;
All of the parts that you found at that location are moved there, if necessary.  All parts that should have been found there, but weren&amp;#039;t, get moved to the Variance location!&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=ITrack/Enterprise/LXW&amp;diff=6218</id>
		<title>ITrack/Enterprise/LXW</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=ITrack/Enterprise/LXW&amp;diff=6218"/>
		<updated>2012-11-12T22:56:53Z</updated>

		<summary type="html">&lt;p&gt;Duff: DOCUMENTATION&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The mobile version of ITrack, for running warehouses with scanners!&lt;br /&gt;
&lt;br /&gt;
== Picking ==&lt;br /&gt;
# Scan a sales order&lt;br /&gt;
# Scan a part&lt;br /&gt;
# Scan a destination location (if you want to)&lt;br /&gt;
&lt;br /&gt;
The part gets marked as picked in the delivery system, and gets moved to the destination location.  If you don&amp;#039;t specify a destination location, it uses the default, which is set in the store settings.&lt;br /&gt;
&lt;br /&gt;
If you don&amp;#039;t want to scan a destination location, you can just scan a new document to begin picking another part, or close the screen.&lt;br /&gt;
&lt;br /&gt;
== Inventory move ==&lt;br /&gt;
# Scan a location&lt;br /&gt;
# Scan any number of parts at the location&lt;br /&gt;
# Scan a destination location&lt;br /&gt;
&lt;br /&gt;
All the parts you scanned get moved!&lt;br /&gt;
&lt;br /&gt;
== Inventory Detail ==&lt;br /&gt;
Scan any part to see information about it!&lt;br /&gt;
&lt;br /&gt;
== Inventory Count ==&lt;br /&gt;
# Scan a location&lt;br /&gt;
# Scan all the parts at that location&lt;br /&gt;
# Scan a new location to count at, or close the screen&lt;br /&gt;
&lt;br /&gt;
All of the parts that you found at that location are moved there, if necessary.  All parts that should have been found there, but weren&amp;#039;t, get moved to the Variance location!&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=User:Jbonge&amp;diff=6217</id>
		<title>User:Jbonge</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=User:Jbonge&amp;diff=6217"/>
		<updated>2012-11-12T20:40:50Z</updated>

		<summary type="html">&lt;p&gt;Duff: Welcome to ISoft!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:ISoft Employees]]&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Category:ISoft_Employees&amp;diff=6143</id>
		<title>Category:ISoft Employees</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Category:ISoft_Employees&amp;diff=6143"/>
		<updated>2012-10-15T15:14:50Z</updated>

		<summary type="html">&lt;p&gt;Duff: /* Developers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Want to talk to one of these people?  You can totally [[ISoft Data Systems#Phone_Numbers|call us]]!&lt;br /&gt;
&lt;br /&gt;
Are you one of these people?  You should probably read up on the [[things ISoft employees should know]]!&lt;br /&gt;
&lt;br /&gt;
==Administration==&lt;br /&gt;
* [[Matthew Wegener]]&lt;br /&gt;
* [[Emily Lowell]]&lt;br /&gt;
&lt;br /&gt;
==Art and Advertising==&lt;br /&gt;
* [[Amos Sterns]]&lt;br /&gt;
&lt;br /&gt;
==Developers==&lt;br /&gt;
* [[Andrew Johnson]]&lt;br /&gt;
* [[Brian Roy]]&lt;br /&gt;
* [[Dillon Sadofsky]]&lt;br /&gt;
* [[Josh Duff]]&lt;br /&gt;
* [[Justin McKinstry]]&lt;br /&gt;
* [[Steven Patras]]&lt;br /&gt;
* [[Svyatoslav Voznyuk]]&lt;br /&gt;
&lt;br /&gt;
==Implementation==&lt;br /&gt;
* [[Tony Merritt]]&lt;br /&gt;
* [[Mark Hardisty]]&lt;br /&gt;
&lt;br /&gt;
==Sales==&lt;br /&gt;
* [[Brendan Evans]]&lt;br /&gt;
&lt;br /&gt;
==Support==&lt;br /&gt;
* [[Cody Hanson]]&lt;br /&gt;
* [[Dayton Lowell]]&lt;br /&gt;
* [[Justin Wheeler]]&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Category:ISoft_Employees&amp;diff=6129</id>
		<title>Category:ISoft Employees</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Category:ISoft_Employees&amp;diff=6129"/>
		<updated>2012-10-09T20:20:51Z</updated>

		<summary type="html">&lt;p&gt;Duff: /* Developers */ Sure, we&amp;#039;ll call Ryan a developer&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Want to talk to one of these people?  You can totally [[ISoft Data Systems#Phone_Numbers|call us]]!&lt;br /&gt;
&lt;br /&gt;
Are you one of these people?  You should probably read up on the [[things ISoft employees should know]]!&lt;br /&gt;
&lt;br /&gt;
==Administration==&lt;br /&gt;
* [[Matthew Wegener]]&lt;br /&gt;
* [[Emily Lowell]]&lt;br /&gt;
&lt;br /&gt;
==Art and Advertising==&lt;br /&gt;
* [[Amos Sterns]]&lt;br /&gt;
&lt;br /&gt;
==Developers==&lt;br /&gt;
* [[Andrew Johnson]]&lt;br /&gt;
* [[Brian Roy]]&lt;br /&gt;
* [[Dillon Sadofsky]]&lt;br /&gt;
* [[Josh Duff]]&lt;br /&gt;
* [[Justin McKinstry]]&lt;br /&gt;
* [[Ryan Geiger]]&lt;br /&gt;
* [[Steven Patras]]&lt;br /&gt;
* [[Svyatoslav Voznyuk]]&lt;br /&gt;
&lt;br /&gt;
==Implementation==&lt;br /&gt;
* [[Tony Merritt]]&lt;br /&gt;
* [[Mark Hardisty]]&lt;br /&gt;
&lt;br /&gt;
==Sales==&lt;br /&gt;
* [[Brendan Evans]]&lt;br /&gt;
&lt;br /&gt;
==Support==&lt;br /&gt;
* [[Cody Hanson]]&lt;br /&gt;
* [[Dayton Lowell]]&lt;br /&gt;
* [[Justin Wheeler]]&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=MediaWiki:Sidebar&amp;diff=6120</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=MediaWiki:Sidebar&amp;diff=6120"/>
		<updated>2012-10-05T22:59:01Z</updated>

		<summary type="html">&lt;p&gt;Duff: Adding link to Presage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* search&lt;br /&gt;
** Wiki_search|Search whole site&lt;br /&gt;
** ITrack/Pro|Search ITrack Pro&lt;br /&gt;
** ITrack/Enterprise|Search ITrack Enterprise&lt;br /&gt;
** Presage|Search Presage&lt;br /&gt;
&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage&lt;br /&gt;
** Categories|Categories&lt;br /&gt;
&amp;lt;!-- ** portal-url|portal --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** currentevents-url|currentevents --&amp;gt;&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
&amp;lt;!-- ** helppage|help --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** sitesupport-url|sitesupport --&amp;gt;&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Presage&amp;diff=6119</id>
		<title>Presage</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Presage&amp;diff=6119"/>
		<updated>2012-10-05T22:55:44Z</updated>

		<summary type="html">&lt;p&gt;Duff: New Presage landing page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;inputbox&amp;gt;&lt;br /&gt;
type=fulltext&lt;br /&gt;
searchbuttonlabel=Search Presage&lt;br /&gt;
break=no&lt;br /&gt;
hiddentext=-(intitle:ITrack/AX) -(intitle:ITrack/Enterprise) -(intitle:ITrack/Pro)&lt;br /&gt;
&amp;lt;/inputbox&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please feel free to [[ISoft chat|instant message]], [mailto:support@isoftdata.com email] or [[ISoft Data Systems|call]] us.&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=ITrack/Enterprise&amp;diff=6118</id>
		<title>ITrack/Enterprise</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=ITrack/Enterprise&amp;diff=6118"/>
		<updated>2012-10-05T22:54:41Z</updated>

		<summary type="html">&lt;p&gt;Duff: Filtering out Presage content&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:ITrack_Enterprise_Logo_for_Wiki2.jpg|frame|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;inputbox&amp;gt;&lt;br /&gt;
type=fulltext&lt;br /&gt;
searchbuttonlabel=Search ITrack Enterprise&lt;br /&gt;
break=no&lt;br /&gt;
hiddentext=-(intitle:ITrack/Pro) -(intitle:ITrack/AX) -(intitle:Presage)&lt;br /&gt;
&amp;lt;/inputbox&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [http://goo.gl/mod/sYvg Submit suggestions on how to make the software better!]&lt;br /&gt;
* [[ITrack_Enterprise_User_&amp;#039;s_Guide|ITrack Enterprise User&amp;#039;s Manual]]&lt;br /&gt;
* [[ITrack/Enterprise/Troubleshooting|Troubleshooting]]&lt;br /&gt;
* [[:Category:ITrack/Problems/Error_Messages|Error Messages]]&lt;br /&gt;
* [[ITrack/Enterprise/Changelog|Recent Changes to ITrack Enterprise]]&lt;br /&gt;
&lt;br /&gt;
Please feel free to [[ISoft chat|instant message]], [mailto:support@isoftdata.com email] or [[ISoft Data Systems|call]] us.&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=ITrack/Pro&amp;diff=6117</id>
		<title>ITrack/Pro</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=ITrack/Pro&amp;diff=6117"/>
		<updated>2012-10-05T22:54:29Z</updated>

		<summary type="html">&lt;p&gt;Duff: Filtering out Presage content&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:ITrack_Pro_Logo_for_Wiki.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;inputbox&amp;gt;&lt;br /&gt;
type=fulltext&lt;br /&gt;
searchbuttonlabel=Search ITrack Pro&lt;br /&gt;
break=no&lt;br /&gt;
hiddentext=-(intitle:ITrack/AX) -(intitle:ITrack/Enterprise) -(intitle:Presage)&lt;br /&gt;
&amp;lt;/inputbox&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [[ITrack/Pro/User Guide|ITrack Pro User&amp;#039;s Manual]]&lt;br /&gt;
&lt;br /&gt;
* [[ITrack/Pro/Troubleshooting|Troubleshooting]]&lt;br /&gt;
&lt;br /&gt;
* [[:Category:ITrack/Problems/Error_Messages|Error Messages]]&lt;br /&gt;
&lt;br /&gt;
* [[ITrack/Pro/Changelog|Recent Changes to ITrack Pro]]&lt;br /&gt;
&lt;br /&gt;
Please feel free to [[ISoft chat|instant message]], [mailto:support@isoftdata.com email] or [[ISoft Data Systems|call]] us.&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Template:Search&amp;diff=6116</id>
		<title>Template:Search</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Template:Search&amp;diff=6116"/>
		<updated>2012-10-05T22:53:55Z</updated>

		<summary type="html">&lt;p&gt;Duff: Adding link to Presage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Search the entire wiki:&lt;br /&gt;
&amp;lt;inputbox&amp;gt;&lt;br /&gt;
type=search&lt;br /&gt;
break=no&lt;br /&gt;
buttonlabel=Go&lt;br /&gt;
searchbuttonlabel=Search&lt;br /&gt;
&amp;lt;/inputbox&amp;gt;&lt;br /&gt;
* Search &amp;#039;&amp;#039;&amp;#039;[[ITrack/Pro|ITrack Pro]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Search &amp;#039;&amp;#039;&amp;#039;[[ITrack/Enterprise|ITrack Enterprise]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Search &amp;#039;&amp;#039;&amp;#039;[[Presage]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Search [[Database:Search|database documentation]]&lt;br /&gt;
* Search [[Internal:Search|internal documentation]]&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Installing_LXW&amp;diff=6088</id>
		<title>Installing LXW</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Installing_LXW&amp;diff=6088"/>
		<updated>2012-09-25T16:26:56Z</updated>

		<summary type="html">&lt;p&gt;Duff: /* Dependencies */ We actually can work with SVN 1.6 or better&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The new version of ITrack LX, colloquially known as LXW, is the faster and sexier version of ITrack designed to run in the browser, primarily on handheld scanner devices.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
Besides the regular version of [[MySQL]] used by ITrack Enterprise, LXW requires:&lt;br /&gt;
* [http://httpd.apache.org/download.cgi Apache] 2.2 or higher&lt;br /&gt;
* [http://php.net/downloads.php PHP] 5.3 or higher&lt;br /&gt;
* [http://nodejs.org/download/ Node.js] 0.8 or higher&lt;br /&gt;
* [http://subversion.apache.org/ SVN] 1.6 or higher&lt;br /&gt;
&lt;br /&gt;
== Installing the server-side code ==&lt;br /&gt;
This is the PHP code that talks to the database!  It should be checked out somewhere that is &amp;#039;&amp;#039;not&amp;#039;&amp;#039; accessible via HTTP.&lt;br /&gt;
&lt;br /&gt;
The directory to check out is [http://svn.isoftdata.com/svn/Web/tinymvc-branches/lxw-release http://svn.isoftdata.com/svn/Web/tinymvc-branches/lxw-release].&lt;br /&gt;
&lt;br /&gt;
To configure the database connection, edit /lxw/configs/database.php.&lt;br /&gt;
&lt;br /&gt;
== Installing the client-side code ==&lt;br /&gt;
This is the code that is accessible via HTTP!  Check it out to your Apache htdocs folder, or whatever other folder will get it served up to the tubes.&lt;br /&gt;
&lt;br /&gt;
The directory to check out is [http://svn.isoftdata.com/svn/Web/tinymvc-branches/lxw-release/lxw/client http://svn.isoftdata.com/svn/Web/tinymvc-branches/lxw-release/lxw/client].&lt;br /&gt;
&lt;br /&gt;
To configure the connection to the server-side code: edit line 15 of server/index.php to point it at the path where you checked out the server-side code.&lt;br /&gt;
&lt;br /&gt;
To configure client application settings (which should all have reasonable defaults), you can edit the config.js file in the client path.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
Browsing to the [the URL you would expect to correspond to the client-side files you installed]/server/index.php should show you a snide remark embedded in JSON.&lt;br /&gt;
&lt;br /&gt;
Browsing to the regular URL should show you a screen asking you to identify your store number (assuming that your web server is configured to serve up index.html files when you browse to a directory).&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Installing_LXW&amp;diff=6087</id>
		<title>Installing LXW</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Installing_LXW&amp;diff=6087"/>
		<updated>2012-09-25T16:25:45Z</updated>

		<summary type="html">&lt;p&gt;Duff: Adding dependencies&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The new version of ITrack LX, colloquially known as LXW, is the faster and sexier version of ITrack designed to run in the browser, primarily on handheld scanner devices.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
Besides the regular version of [[MySQL]] used by ITrack Enterprise, LXW requires:&lt;br /&gt;
* [http://httpd.apache.org/download.cgi Apache] 2.2 or higher&lt;br /&gt;
* [http://php.net/downloads.php PHP] 5.3 or higher&lt;br /&gt;
* [http://nodejs.org/download/ Node.js] 0.8 or higher&lt;br /&gt;
* [http://subversion.apache.org/ SVN] 1.7 or higher&lt;br /&gt;
&lt;br /&gt;
== Installing the server-side code ==&lt;br /&gt;
This is the PHP code that talks to the database!  It should be checked out somewhere that is &amp;#039;&amp;#039;not&amp;#039;&amp;#039; accessible via HTTP.&lt;br /&gt;
&lt;br /&gt;
The directory to check out is [http://svn.isoftdata.com/svn/Web/tinymvc-branches/lxw-release http://svn.isoftdata.com/svn/Web/tinymvc-branches/lxw-release].&lt;br /&gt;
&lt;br /&gt;
To configure the database connection, edit /lxw/configs/database.php.&lt;br /&gt;
&lt;br /&gt;
== Installing the client-side code ==&lt;br /&gt;
This is the code that is accessible via HTTP!  Check it out to your Apache htdocs folder, or whatever other folder will get it served up to the tubes.&lt;br /&gt;
&lt;br /&gt;
The directory to check out is [http://svn.isoftdata.com/svn/Web/tinymvc-branches/lxw-release/lxw/client http://svn.isoftdata.com/svn/Web/tinymvc-branches/lxw-release/lxw/client].&lt;br /&gt;
&lt;br /&gt;
To configure the connection to the server-side code: edit line 15 of server/index.php to point it at the path where you checked out the server-side code.&lt;br /&gt;
&lt;br /&gt;
To configure client application settings (which should all have reasonable defaults), you can edit the config.js file in the client path.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
Browsing to the [the URL you would expect to correspond to the client-side files you installed]/server/index.php should show you a snide remark embedded in JSON.&lt;br /&gt;
&lt;br /&gt;
Browsing to the regular URL should show you a screen asking you to identify your store number (assuming that your web server is configured to serve up index.html files when you browse to a directory).&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Conference_Room_Setup&amp;diff=6039</id>
		<title>Conference Room Setup</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Conference_Room_Setup&amp;diff=6039"/>
		<updated>2012-08-19T04:08:53Z</updated>

		<summary type="html">&lt;p&gt;Duff: Fixing headers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This guide permanently resides at: http://wikido.isoftdata.com/index.php/Conference_Room_Setup&lt;br /&gt;
&lt;br /&gt;
==How to get started==&lt;br /&gt;
If nothing is turned on:&lt;br /&gt;
# Turn on the receiver [[Image:receiver_power.jpg|thumb|none]]&lt;br /&gt;
# Turn on the projector [[Image:remote.jpg|thumb|none]]&lt;br /&gt;
# Select the correct source for what you want to do&lt;br /&gt;
#* For Media/Presentation Computer: Press BD/DVD [[Image:receiver_bddvd.jpg|thumb|none]]&lt;br /&gt;
#* For XBox: Press GAME [[Image:receiver_game.jpg|thumb|none]]&lt;br /&gt;
# Turn on your source&lt;br /&gt;
#* The media computer should have a solid white light for its power.  If not, press the power button on it [[Image:mediapc.jpg|thumb|none]]&lt;br /&gt;
&lt;br /&gt;
==When you&amp;#039;re done==&lt;br /&gt;
# Turn off your video source&lt;br /&gt;
# Turn off the projector [[Image:remote.jpg|thumb|none]]&lt;br /&gt;
# Turn off the receiver [[Image:receiver_power.jpg|thumb|none]]&lt;br /&gt;
&lt;br /&gt;
==Further Questions==&lt;br /&gt;
Ask Justin M at ISoft (room 103) or Matthew!&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Tony_Merritt&amp;diff=6028</id>
		<title>Tony Merritt</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Tony_Merritt&amp;diff=6028"/>
		<updated>2012-08-16T21:19:47Z</updated>

		<summary type="html">&lt;p&gt;Duff: He made a new account&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[User:Tmerritt]]&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=User:Tmerritt&amp;diff=6027</id>
		<title>User:Tmerritt</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=User:Tmerritt&amp;diff=6027"/>
		<updated>2012-08-16T21:19:00Z</updated>

		<summary type="html">&lt;p&gt;Duff: Tony&amp;#039;s new account&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tony is a sexy man who currently makes a living by pwning other people&amp;#039;s problems.&lt;br /&gt;
&lt;br /&gt;
[[Category:ISoft Employees]]&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=ITrack/Barcodes&amp;diff=6026</id>
		<title>ITrack/Barcodes</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=ITrack/Barcodes&amp;diff=6026"/>
		<updated>2012-08-16T16:53:12Z</updated>

		<summary type="html">&lt;p&gt;Duff: /* Barcode contents */ Adding work order&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Several elements of ITrack and ITrack software utilize barcodes.  All ITrack products should utilize a similar barcoding scheme.&lt;br /&gt;
&lt;br /&gt;
== Preamble and postamble ==&lt;br /&gt;
Virtually every barcode scanner can be programmed to simulate a keypress combination before entering the barcode contents (the preamble) and after (postamble).&lt;br /&gt;
&lt;br /&gt;
=== ITrack Pro ===&lt;br /&gt;
ITrack Pro document screens (Sales, Quotes, Purchase Orders) expect a preamble of Ctrl+b and a postamble of \n.&lt;br /&gt;
&lt;br /&gt;
The document screens will take whatever value is between those characters and do a lookup by [[ITrack/Pro/Part Number|partnum]] (the value encoded in barcodes on ITrack Pro tags), and if no values are found by partnum, by UPC (the value encoded into the barcodes printed on most products).&lt;br /&gt;
&lt;br /&gt;
=== Workclock ===&lt;br /&gt;
The workclock system expects the barcode scanner to provide a preamble and postamble of &amp;#039;:$:&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Barcode contents ==&lt;br /&gt;
Depending on the context, the barcode will encode different types of values.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Object&lt;br /&gt;
! Barcode contents&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Inventory&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;[inventoryid]&amp;#039;&amp;#039;&amp;#039; OR &amp;#039;&amp;#039;&amp;#039;[UPC code]&amp;#039;&amp;#039;&amp;#039; OR &amp;#039;&amp;#039;&amp;#039;[OEM Number]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| If the number is less than 10 digits, it is assumed to be the primary key of an inventory record (inventoryid in Enterprise, partnum in Pro). Numbers with greater than 10 digits are assumed to be UPC codes.&lt;br /&gt;
|-&lt;br /&gt;
| Location&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;%[locationid]&amp;#039;&amp;#039;&amp;#039; OR &amp;#039;&amp;#039;&amp;#039;[full location name]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Ideally, location barcodes should be the locationid, prefaced by a % sign.  In some cases, sadly, they may be an unqualified string.&lt;br /&gt;
|-&lt;br /&gt;
| ITrack user&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;U[userid]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| Work Order&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;W[storeid]-[workorderid]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| Work Order Job&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;J[jobid]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| Sales Order&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;S[storeid]-[salesorderid]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| Purchase Order&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;P[storeid]-[purchaseorderid]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| Transfer Order&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;T[transferorderid]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| Serialized part&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;[inventoryid]-[inventoryserialid]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Other, context-sensitive ===&lt;br /&gt;
Prefaced with + - Signifies that the rest of the barcode contains a context-sensitive command, which will probably not have meaning outside of magical bar-code applications.&lt;br /&gt;
* CLOCKIN - Clocks the selected user into a selected job&lt;br /&gt;
* CLOCKOUT - Clocks the selected user out of an active job&lt;/div&gt;</summary>
		<author><name>Duff</name></author>
	</entry>
</feed>