Full Code of daffl/jquery.dform for AI

master 90d2447bac56 cached
375 files
1.9 MB
659.8k tokens
3 symbols
1 requests
Download .txt
Showing preview only (2,204K chars total). Download the full file or copy to clipboard to get everything.
Repository: daffl/jquery.dform
Branch: master
Commit: 90d2447bac56
Files: 375
Total size: 1.9 MB

Directory structure:
gitextract_g3jmq8p2/

├── .gitignore
├── .npmignore
├── .travis.yml
├── Gruntfile.js
├── bower.json
├── dist/
│   ├── jquery.dform-1.0.1.js
│   └── jquery.dform-1.1.0.js
├── package.json
├── readme.md
├── src/
│   ├── dform.converters.js
│   ├── dform.core.js
│   ├── dform.extensions.js
│   └── dform.js
├── start.html
└── test/
    ├── index.html
    ├── libs/
    │   ├── cultures/
    │   │   ├── globalize.culture.af-ZA.js
    │   │   ├── globalize.culture.af.js
    │   │   ├── globalize.culture.am-ET.js
    │   │   ├── globalize.culture.am.js
    │   │   ├── globalize.culture.ar-AE.js
    │   │   ├── globalize.culture.ar-BH.js
    │   │   ├── globalize.culture.ar-DZ.js
    │   │   ├── globalize.culture.ar-EG.js
    │   │   ├── globalize.culture.ar-IQ.js
    │   │   ├── globalize.culture.ar-JO.js
    │   │   ├── globalize.culture.ar-KW.js
    │   │   ├── globalize.culture.ar-LB.js
    │   │   ├── globalize.culture.ar-LY.js
    │   │   ├── globalize.culture.ar-MA.js
    │   │   ├── globalize.culture.ar-OM.js
    │   │   ├── globalize.culture.ar-QA.js
    │   │   ├── globalize.culture.ar-SA.js
    │   │   ├── globalize.culture.ar-SY.js
    │   │   ├── globalize.culture.ar-TN.js
    │   │   ├── globalize.culture.ar-YE.js
    │   │   ├── globalize.culture.ar.js
    │   │   ├── globalize.culture.arn-CL.js
    │   │   ├── globalize.culture.arn.js
    │   │   ├── globalize.culture.as-IN.js
    │   │   ├── globalize.culture.as.js
    │   │   ├── globalize.culture.az-Cyrl-AZ.js
    │   │   ├── globalize.culture.az-Cyrl.js
    │   │   ├── globalize.culture.az-Latn-AZ.js
    │   │   ├── globalize.culture.az-Latn.js
    │   │   ├── globalize.culture.az.js
    │   │   ├── globalize.culture.ba-RU.js
    │   │   ├── globalize.culture.ba.js
    │   │   ├── globalize.culture.be-BY.js
    │   │   ├── globalize.culture.be.js
    │   │   ├── globalize.culture.bg-BG.js
    │   │   ├── globalize.culture.bg.js
    │   │   ├── globalize.culture.bn-BD.js
    │   │   ├── globalize.culture.bn-IN.js
    │   │   ├── globalize.culture.bn.js
    │   │   ├── globalize.culture.bo-CN.js
    │   │   ├── globalize.culture.bo.js
    │   │   ├── globalize.culture.br-FR.js
    │   │   ├── globalize.culture.br.js
    │   │   ├── globalize.culture.bs-Cyrl-BA.js
    │   │   ├── globalize.culture.bs-Cyrl.js
    │   │   ├── globalize.culture.bs-Latn-BA.js
    │   │   ├── globalize.culture.bs-Latn.js
    │   │   ├── globalize.culture.bs.js
    │   │   ├── globalize.culture.ca-ES.js
    │   │   ├── globalize.culture.ca.js
    │   │   ├── globalize.culture.co-FR.js
    │   │   ├── globalize.culture.co.js
    │   │   ├── globalize.culture.cs-CZ.js
    │   │   ├── globalize.culture.cs.js
    │   │   ├── globalize.culture.cy-GB.js
    │   │   ├── globalize.culture.cy.js
    │   │   ├── globalize.culture.da-DK.js
    │   │   ├── globalize.culture.da.js
    │   │   ├── globalize.culture.de-AT.js
    │   │   ├── globalize.culture.de-CH.js
    │   │   ├── globalize.culture.de-DE.js
    │   │   ├── globalize.culture.de-LI.js
    │   │   ├── globalize.culture.de-LU.js
    │   │   ├── globalize.culture.de.js
    │   │   ├── globalize.culture.dsb-DE.js
    │   │   ├── globalize.culture.dsb.js
    │   │   ├── globalize.culture.dv-MV.js
    │   │   ├── globalize.culture.dv.js
    │   │   ├── globalize.culture.el-GR.js
    │   │   ├── globalize.culture.el.js
    │   │   ├── globalize.culture.en-029.js
    │   │   ├── globalize.culture.en-AU.js
    │   │   ├── globalize.culture.en-BZ.js
    │   │   ├── globalize.culture.en-CA.js
    │   │   ├── globalize.culture.en-GB.js
    │   │   ├── globalize.culture.en-IE.js
    │   │   ├── globalize.culture.en-IN.js
    │   │   ├── globalize.culture.en-JM.js
    │   │   ├── globalize.culture.en-MY.js
    │   │   ├── globalize.culture.en-NZ.js
    │   │   ├── globalize.culture.en-PH.js
    │   │   ├── globalize.culture.en-SG.js
    │   │   ├── globalize.culture.en-TT.js
    │   │   ├── globalize.culture.en-US.js
    │   │   ├── globalize.culture.en-ZA.js
    │   │   ├── globalize.culture.en-ZW.js
    │   │   ├── globalize.culture.es-AR.js
    │   │   ├── globalize.culture.es-BO.js
    │   │   ├── globalize.culture.es-CL.js
    │   │   ├── globalize.culture.es-CO.js
    │   │   ├── globalize.culture.es-CR.js
    │   │   ├── globalize.culture.es-DO.js
    │   │   ├── globalize.culture.es-EC.js
    │   │   ├── globalize.culture.es-ES.js
    │   │   ├── globalize.culture.es-GT.js
    │   │   ├── globalize.culture.es-HN.js
    │   │   ├── globalize.culture.es-MX.js
    │   │   ├── globalize.culture.es-NI.js
    │   │   ├── globalize.culture.es-PA.js
    │   │   ├── globalize.culture.es-PE.js
    │   │   ├── globalize.culture.es-PR.js
    │   │   ├── globalize.culture.es-PY.js
    │   │   ├── globalize.culture.es-SV.js
    │   │   ├── globalize.culture.es-US.js
    │   │   ├── globalize.culture.es-UY.js
    │   │   ├── globalize.culture.es-VE.js
    │   │   ├── globalize.culture.es.js
    │   │   ├── globalize.culture.et-EE.js
    │   │   ├── globalize.culture.et.js
    │   │   ├── globalize.culture.eu-ES.js
    │   │   ├── globalize.culture.eu.js
    │   │   ├── globalize.culture.fa-IR.js
    │   │   ├── globalize.culture.fa.js
    │   │   ├── globalize.culture.fi-FI.js
    │   │   ├── globalize.culture.fi.js
    │   │   ├── globalize.culture.fil-PH.js
    │   │   ├── globalize.culture.fil.js
    │   │   ├── globalize.culture.fo-FO.js
    │   │   ├── globalize.culture.fo.js
    │   │   ├── globalize.culture.fr-BE.js
    │   │   ├── globalize.culture.fr-CA.js
    │   │   ├── globalize.culture.fr-CH.js
    │   │   ├── globalize.culture.fr-FR.js
    │   │   ├── globalize.culture.fr-LU.js
    │   │   ├── globalize.culture.fr-MC.js
    │   │   ├── globalize.culture.fr.js
    │   │   ├── globalize.culture.fy-NL.js
    │   │   ├── globalize.culture.fy.js
    │   │   ├── globalize.culture.ga-IE.js
    │   │   ├── globalize.culture.ga.js
    │   │   ├── globalize.culture.gd-GB.js
    │   │   ├── globalize.culture.gd.js
    │   │   ├── globalize.culture.gl-ES.js
    │   │   ├── globalize.culture.gl.js
    │   │   ├── globalize.culture.gsw-FR.js
    │   │   ├── globalize.culture.gsw.js
    │   │   ├── globalize.culture.gu-IN.js
    │   │   ├── globalize.culture.gu.js
    │   │   ├── globalize.culture.ha-Latn-NG.js
    │   │   ├── globalize.culture.ha-Latn.js
    │   │   ├── globalize.culture.ha.js
    │   │   ├── globalize.culture.he-IL.js
    │   │   ├── globalize.culture.he.js
    │   │   ├── globalize.culture.hi-IN.js
    │   │   ├── globalize.culture.hi.js
    │   │   ├── globalize.culture.hr-BA.js
    │   │   ├── globalize.culture.hr-HR.js
    │   │   ├── globalize.culture.hr.js
    │   │   ├── globalize.culture.hsb-DE.js
    │   │   ├── globalize.culture.hsb.js
    │   │   ├── globalize.culture.hu-HU.js
    │   │   ├── globalize.culture.hu.js
    │   │   ├── globalize.culture.hy-AM.js
    │   │   ├── globalize.culture.hy.js
    │   │   ├── globalize.culture.id-ID.js
    │   │   ├── globalize.culture.id.js
    │   │   ├── globalize.culture.ig-NG.js
    │   │   ├── globalize.culture.ig.js
    │   │   ├── globalize.culture.ii-CN.js
    │   │   ├── globalize.culture.ii.js
    │   │   ├── globalize.culture.is-IS.js
    │   │   ├── globalize.culture.is.js
    │   │   ├── globalize.culture.it-CH.js
    │   │   ├── globalize.culture.it-IT.js
    │   │   ├── globalize.culture.it.js
    │   │   ├── globalize.culture.iu-Cans-CA.js
    │   │   ├── globalize.culture.iu-Cans.js
    │   │   ├── globalize.culture.iu-Latn-CA.js
    │   │   ├── globalize.culture.iu-Latn.js
    │   │   ├── globalize.culture.iu.js
    │   │   ├── globalize.culture.ja-JP.js
    │   │   ├── globalize.culture.ja.js
    │   │   ├── globalize.culture.ka-GE.js
    │   │   ├── globalize.culture.ka.js
    │   │   ├── globalize.culture.kk-KZ.js
    │   │   ├── globalize.culture.kk.js
    │   │   ├── globalize.culture.kl-GL.js
    │   │   ├── globalize.culture.kl.js
    │   │   ├── globalize.culture.km-KH.js
    │   │   ├── globalize.culture.km.js
    │   │   ├── globalize.culture.kn-IN.js
    │   │   ├── globalize.culture.kn.js
    │   │   ├── globalize.culture.ko-KR.js
    │   │   ├── globalize.culture.ko.js
    │   │   ├── globalize.culture.kok-IN.js
    │   │   ├── globalize.culture.kok.js
    │   │   ├── globalize.culture.ky-KG.js
    │   │   ├── globalize.culture.ky.js
    │   │   ├── globalize.culture.lb-LU.js
    │   │   ├── globalize.culture.lb.js
    │   │   ├── globalize.culture.lo-LA.js
    │   │   ├── globalize.culture.lo.js
    │   │   ├── globalize.culture.lt-LT.js
    │   │   ├── globalize.culture.lt.js
    │   │   ├── globalize.culture.lv-LV.js
    │   │   ├── globalize.culture.lv.js
    │   │   ├── globalize.culture.mi-NZ.js
    │   │   ├── globalize.culture.mi.js
    │   │   ├── globalize.culture.mk-MK.js
    │   │   ├── globalize.culture.mk.js
    │   │   ├── globalize.culture.ml-IN.js
    │   │   ├── globalize.culture.ml.js
    │   │   ├── globalize.culture.mn-Cyrl.js
    │   │   ├── globalize.culture.mn-MN.js
    │   │   ├── globalize.culture.mn-Mong-CN.js
    │   │   ├── globalize.culture.mn-Mong.js
    │   │   ├── globalize.culture.mn.js
    │   │   ├── globalize.culture.moh-CA.js
    │   │   ├── globalize.culture.moh.js
    │   │   ├── globalize.culture.mr-IN.js
    │   │   ├── globalize.culture.mr.js
    │   │   ├── globalize.culture.ms-BN.js
    │   │   ├── globalize.culture.ms-MY.js
    │   │   ├── globalize.culture.ms.js
    │   │   ├── globalize.culture.mt-MT.js
    │   │   ├── globalize.culture.mt.js
    │   │   ├── globalize.culture.nb-NO.js
    │   │   ├── globalize.culture.nb.js
    │   │   ├── globalize.culture.ne-NP.js
    │   │   ├── globalize.culture.ne.js
    │   │   ├── globalize.culture.nl-BE.js
    │   │   ├── globalize.culture.nl-NL.js
    │   │   ├── globalize.culture.nl.js
    │   │   ├── globalize.culture.nn-NO.js
    │   │   ├── globalize.culture.nn.js
    │   │   ├── globalize.culture.no.js
    │   │   ├── globalize.culture.nso-ZA.js
    │   │   ├── globalize.culture.nso.js
    │   │   ├── globalize.culture.oc-FR.js
    │   │   ├── globalize.culture.oc.js
    │   │   ├── globalize.culture.or-IN.js
    │   │   ├── globalize.culture.or.js
    │   │   ├── globalize.culture.pa-IN.js
    │   │   ├── globalize.culture.pa.js
    │   │   ├── globalize.culture.pl-PL.js
    │   │   ├── globalize.culture.pl.js
    │   │   ├── globalize.culture.prs-AF.js
    │   │   ├── globalize.culture.prs.js
    │   │   ├── globalize.culture.ps-AF.js
    │   │   ├── globalize.culture.ps.js
    │   │   ├── globalize.culture.pt-BR.js
    │   │   ├── globalize.culture.pt-PT.js
    │   │   ├── globalize.culture.pt.js
    │   │   ├── globalize.culture.qut-GT.js
    │   │   ├── globalize.culture.qut.js
    │   │   ├── globalize.culture.quz-BO.js
    │   │   ├── globalize.culture.quz-EC.js
    │   │   ├── globalize.culture.quz-PE.js
    │   │   ├── globalize.culture.quz.js
    │   │   ├── globalize.culture.rm-CH.js
    │   │   ├── globalize.culture.rm.js
    │   │   ├── globalize.culture.ro-RO.js
    │   │   ├── globalize.culture.ro.js
    │   │   ├── globalize.culture.ru-RU.js
    │   │   ├── globalize.culture.ru.js
    │   │   ├── globalize.culture.rw-RW.js
    │   │   ├── globalize.culture.rw.js
    │   │   ├── globalize.culture.sa-IN.js
    │   │   ├── globalize.culture.sa.js
    │   │   ├── globalize.culture.sah-RU.js
    │   │   ├── globalize.culture.sah.js
    │   │   ├── globalize.culture.se-FI.js
    │   │   ├── globalize.culture.se-NO.js
    │   │   ├── globalize.culture.se-SE.js
    │   │   ├── globalize.culture.se.js
    │   │   ├── globalize.culture.si-LK.js
    │   │   ├── globalize.culture.si.js
    │   │   ├── globalize.culture.sk-SK.js
    │   │   ├── globalize.culture.sk.js
    │   │   ├── globalize.culture.sl-SI.js
    │   │   ├── globalize.culture.sl.js
    │   │   ├── globalize.culture.sma-NO.js
    │   │   ├── globalize.culture.sma-SE.js
    │   │   ├── globalize.culture.sma.js
    │   │   ├── globalize.culture.smj-NO.js
    │   │   ├── globalize.culture.smj-SE.js
    │   │   ├── globalize.culture.smj.js
    │   │   ├── globalize.culture.smn-FI.js
    │   │   ├── globalize.culture.smn.js
    │   │   ├── globalize.culture.sms-FI.js
    │   │   ├── globalize.culture.sms.js
    │   │   ├── globalize.culture.sq-AL.js
    │   │   ├── globalize.culture.sq.js
    │   │   ├── globalize.culture.sr-Cyrl-BA.js
    │   │   ├── globalize.culture.sr-Cyrl-CS.js
    │   │   ├── globalize.culture.sr-Cyrl-ME.js
    │   │   ├── globalize.culture.sr-Cyrl-RS.js
    │   │   ├── globalize.culture.sr-Cyrl.js
    │   │   ├── globalize.culture.sr-Latn-BA.js
    │   │   ├── globalize.culture.sr-Latn-CS.js
    │   │   ├── globalize.culture.sr-Latn-ME.js
    │   │   ├── globalize.culture.sr-Latn-RS.js
    │   │   ├── globalize.culture.sr-Latn.js
    │   │   ├── globalize.culture.sr.js
    │   │   ├── globalize.culture.sv-FI.js
    │   │   ├── globalize.culture.sv-SE.js
    │   │   ├── globalize.culture.sv.js
    │   │   ├── globalize.culture.sw-KE.js
    │   │   ├── globalize.culture.sw.js
    │   │   ├── globalize.culture.syr-SY.js
    │   │   ├── globalize.culture.syr.js
    │   │   ├── globalize.culture.ta-IN.js
    │   │   ├── globalize.culture.ta.js
    │   │   ├── globalize.culture.te-IN.js
    │   │   ├── globalize.culture.te.js
    │   │   ├── globalize.culture.tg-Cyrl-TJ.js
    │   │   ├── globalize.culture.tg-Cyrl.js
    │   │   ├── globalize.culture.tg.js
    │   │   ├── globalize.culture.th-TH.js
    │   │   ├── globalize.culture.th.js
    │   │   ├── globalize.culture.tk-TM.js
    │   │   ├── globalize.culture.tk.js
    │   │   ├── globalize.culture.tn-ZA.js
    │   │   ├── globalize.culture.tn.js
    │   │   ├── globalize.culture.tr-TR.js
    │   │   ├── globalize.culture.tr.js
    │   │   ├── globalize.culture.tt-RU.js
    │   │   ├── globalize.culture.tt.js
    │   │   ├── globalize.culture.tzm-Latn-DZ.js
    │   │   ├── globalize.culture.tzm-Latn.js
    │   │   ├── globalize.culture.tzm.js
    │   │   ├── globalize.culture.ug-CN.js
    │   │   ├── globalize.culture.ug.js
    │   │   ├── globalize.culture.uk-UA.js
    │   │   ├── globalize.culture.uk.js
    │   │   ├── globalize.culture.ur-PK.js
    │   │   ├── globalize.culture.ur.js
    │   │   ├── globalize.culture.uz-Cyrl-UZ.js
    │   │   ├── globalize.culture.uz-Cyrl.js
    │   │   ├── globalize.culture.uz-Latn-UZ.js
    │   │   ├── globalize.culture.uz-Latn.js
    │   │   ├── globalize.culture.uz.js
    │   │   ├── globalize.culture.vi-VN.js
    │   │   ├── globalize.culture.vi.js
    │   │   ├── globalize.culture.wo-SN.js
    │   │   ├── globalize.culture.wo.js
    │   │   ├── globalize.culture.xh-ZA.js
    │   │   ├── globalize.culture.xh.js
    │   │   ├── globalize.culture.yo-NG.js
    │   │   ├── globalize.culture.yo.js
    │   │   ├── globalize.culture.zh-CHS.js
    │   │   ├── globalize.culture.zh-CHT.js
    │   │   ├── globalize.culture.zh-CN.js
    │   │   ├── globalize.culture.zh-HK.js
    │   │   ├── globalize.culture.zh-Hans.js
    │   │   ├── globalize.culture.zh-Hant.js
    │   │   ├── globalize.culture.zh-MO.js
    │   │   ├── globalize.culture.zh-SG.js
    │   │   ├── globalize.culture.zh-TW.js
    │   │   ├── globalize.culture.zh.js
    │   │   ├── globalize.culture.zu-ZA.js
    │   │   ├── globalize.culture.zu.js
    │   │   └── globalize.cultures.js
    │   └── globalize.js
    ├── test.js
    ├── test.json
    ├── test_extensions.js
    ├── test_jqueryui.js
    ├── test_subscribers.js
    └── test_types.js

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
.project
*.settings/
/.project
/.project
/build/compiler**
tmp/**
docs**
.idea
node_modules
testee.log

================================================
FILE: .npmignore
================================================
.idea/


================================================
FILE: .travis.yml
================================================
language: node_js
node_js:
  - 0.10


================================================
FILE: Gruntfile.js
================================================
module.exports = function (grunt) {
	grunt.initConfig({
		pkg: grunt.file.readJSON('package.json'),
		connect: {
			server: {
				options: {
					port: 9001,
					base: '.'
				}
			}
		},
		qunit: {
			all: {
				options: {
					urls: ['http://localhost:9001/test/index.html']
				}
			}
		},
		concat: {
			dist: {
				src: ['src/dform.js', 'src/dform.core.js', 'src/dform.extensions.js'],
				dest: 'dist/<%= pkg.name %>-<%= pkg.version %>.js'
			}
		},
		uglify: {
			options: {
				banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'
			},
			build: {
				src: ['dist/<%= pkg.name %>-<%= pkg.version %>.js'],
				dest: 'dist/<%= pkg.name %>-<%= pkg.version %>.min.js'
			}
		}
	});

	grunt.loadNpmTasks('grunt-contrib-uglify');
	grunt.loadNpmTasks('grunt-contrib-concat');
	grunt.loadNpmTasks('grunt-contrib-qunit');
	grunt.loadNpmTasks('grunt-contrib-connect');


	grunt.registerTask('test', ['connect', 'qunit']);
	grunt.registerTask('default', ['concat', 'uglify']);
};


================================================
FILE: bower.json
================================================
{
	"name": "jquery.dform",
	"version": "1.1.0",
	"main": "dist/jquery.dform-1.1.0.js",
	"ignore": [
		".jshintrc",
		"**/*.txt"
	],
	"dependencies": {
		"jquery": ">= 1.7.1"
	}
}

================================================
FILE: dist/jquery.dform-1.0.1.js
================================================
/*
 * jQuery dform plugin
 * Copyright (C) 2012 David Luecke <daff@neyeon.com>, [http://daffl.github.com/jquery.dform]
 * 
 * Licensed under the MIT license
 */
(function ($) {
	var _subscriptions = {},
		_types = {},
		each = $.each,
		addToObject = function (obj) {
			var result = function (data, fn, condition) {
				if (typeof data === 'object') {
					$.each(data, function (name, val) {
						result(name, val, condition);
					});
				} else if (condition === undefined || condition === true) {
					if (!obj[data]) {
						obj[data] = [];
					}
					obj[data].push(fn);
				}
			}
			return result;
		},
		isArray = $.isArray,
		/**
		 * Returns an array of keys (properties) contained in the given object.
		 *
		 * @param {Object} object The object to use
		 * @return {Array} An array containing all properties in the object
		 */
			keyset = function (object) {
			return $.map(object, function (val, key) {
				return key;
			});
		},
		/**
		 * Returns an object that contains all values from the given
		 * object that have a key which is also in the array keys.
		 *
		 * @param {Object} object The object to traverse
		 * @param {Array} keys The keys the new object should contain
		 * @return {Object} A new object containing only the properties
		 * with names given in keys
		 */
			withKeys = function (object, keys) {
			var result = {};
			each(keys, function (index, value) {
				if (object[value]) {
					result[value] = object[value];
				}
			});
			return result;
		},
		/**
		 * Returns an object that contains all value from the given
		 * object that do not have a key which is also in the array keys.
		 *
		 * @param {Object} object The object to traverse
		 * @param {Array} keys A list of keys that should not be contained in the new object
		 * @return {Object} A new object with all properties of the given object, except
		 * for the ones given in the list of keys
		 */
			withoutKeys = function (object, keys) {
			var result = {};
			each(object, function (index, value) {
				if (!~$.inArray(index, keys)) {
					result[index] = value;
				}
			});
			return result;
		},
		/**
		 * Run all subscriptions with the given name and options
		 * on an element.
		 *
		 * @param {String} name The name of the subscriber function
		 * @param {Object} options ptions for the function
		 * @param {String} type The type of the current element as in the registered types
		 * @return {Object} The jQuery object
		 */
			runSubscription = function (name, options, type) {
			if ($.dform.hasSubscription(name)) {
				this.each(function () {
					var element = $(this);
					each(_subscriptions[name], function (i, sfn) {
						// run subscriber function with options
						sfn.call(element, options, type);
					});
				});
			}
			return this;
		},
		/**
		 * Run all subscription functions with given options.
		 *
		 * @param {Object} options The options to use
		 * @return {Object} The jQuery element this function has been called on
		 */
			runAll = function (options) {
			var type = options.type, self = this;
			// Run preprocessing subscribers
			this.dform('run', '[pre]', options, type);
			each(options, function (name, sopts) {
				self.dform('run', name, sopts, type);
			});
			// Run post processing subscribers
			this.dform('run', '[post]', options, type);
			return this;
		};

	/**
	 * Globals added directly to the jQuery object
	 */
	$.extend($, {
		keyset : keyset,
		withKeys : withKeys,
		withoutKeys : withoutKeys,
		dform : {
			/**
			 * Default options the plugin is initialized with:
			 *
			 * ## prefix
			 *
			 * The Default prefix used for element classnames generated by the dform plugin.
			 * Defaults to _ui-dform-_
			 * E.g. an element with type text will have the class ui-dform-text
			 *
			 */
			options : {
				prefix : "ui-dform-"
			},

			/**
			 * A function that is called, when no registered type has been found.
			 * The default behaviour returns an HTML element with the tag
			 * as specified in type and the HTML attributes given in options
			 * (without subscriber options).
			 *
			 * @param {Object} options
			 * @return {Object} The created object
			 */
			defaultType : function (options) {
				return $("<" + options.type + ">").dform('attr', options);
			},
			/**
			 * Return all types.
			 *
			 * @params {String} name (optional) If passed return
			 * all type generators for a given name.
			 * @return {Object} Mapping from type name to
			 * an array of generator functions.
			 */
			types : function (name) {
				return name ? _types[name ] : _types;
			},
			/**
			 * Register an element type function.
			 *
			 * @param {String|Array} data Can either be the name of the type
			 * function or an object that contains name : type function pairs
			 * @param {Function} fn The function that creates a new type element
			 */
			addType : addToObject(_types),
			/**
			 * Returns all subscribers or all subscribers for a given name.
			 *
			 * @params {String} name (optional) If passed return all
			 * subscribers for a given name
			 * @return {Object} Mapping from subscriber names
			 * to an array of subscriber functions.
			 */
			subscribers : function (name) {
				return name ? _subscriptions[name] : _subscriptions;
			},
			/**
			 * Register a subscriber function.
			 *
			 * @param {String|Object} data Can either be the name of the subscriber
			 * function or an object that contains name : subscriber function pairs
			 * @param {Function} fn The function to subscribe or nothing if an object is passed for data
			 * @param {Array} deps An optional list of dependencies
			 */
			subscribe : addToObject(_subscriptions),
			/**
			 * Returns if a subscriber function with the given name
			 * has been registered.
			 *
			 * @param {String} name The subscriber name
			 * @return {Boolean} True if the given name has at least one subscriber registered,
			 *     false otherwise
			 */
			hasSubscription : function (name) {
				return _subscriptions[name] ? true : false;
			},
			/**
			 * Create a new element.
			 *
			 * @param {Object} options - The options to use
			 * @return {Object} The element as created by the builder function specified
			 *     or returned by the defaultType function.
			 */
			createElement : function (options) {
				if (!options.type) {
					throw "No element type given! Must always exist.";
				}
				var type = options.type,
					element = null,
				// We don't need the type key in the options
					opts = $.withoutKeys(options, ["type"]);

				if (_types[type]) {
					// Run all type element builder functions called typename
					each(_types[type], function (i, sfn) {
						element = sfn.call(element, opts);
					});
				} else {
					// Call defaultType function if no type was found
					element = $.dform.defaultType(options);
				}
				return $(element);
			},
			methods : {
				/**
				 * Run all subscriptions with the given name and options
				 * on an element.
				 *
				 * @param {String} name The name of the subscriber function
				 * @param {Object} options ptions for the function
				 * @param {String} type The type of the current element as in the registered types
				 * @return {Object} The jQuery object
				 */
				run : function (name, options, type) {
					if (typeof name !== 'string') {
						return runAll.call(this, name);
					}
					return runSubscription.call(this, name, options, type);
				},
				/**
				 * Creates a form element on an element with given options
				 *
				 * @param {Object} options The options to use
				 * @return {Object} The jQuery element this function has been called on
				 */
				append : function (options, converter) {
					if (converter && $.dform.converters && $.isFunction($.dform.converters[converter])) {
						options = $.dform.converters[converter](options);
					}
					// Create element (run builder function for type)
					var element = $.dform.createElement(options);
					this.append(element);
					// Run all subscriptions
					element.dform('run', options);
				},
				/**
				 * Adds HTML attributes to the current element from the given options.
				 * Any subscriber will be omitted so that the attributes will contain any
				 * key value pair where the key is not the name of a subscriber function
				 * and is not in the string array excludes.
				 *
				 * @param {Object} object The attribute object
				 * @param {Array} excludes A list of keys that should also be excluded
				 * @return {Object} The jQuery object of the this reference
				 */
				attr : function (object, excludes) {
					// Ignore any subscriber name and the objects given in excludes
					var ignores = $.keyset(_subscriptions);
					isArray(excludes) && $.merge(ignores, excludes);
					this.attr($.withoutKeys(object, ignores));
				},
				/**
				 *
				 *
				 * @param params
				 * @param success
				 * @param error
				 */
				ajax : function (params, success, error) {
					var options = {
						error : error,
						url : params
					}, self = this;
					if (typeof params !== 'string') {
						$.extend(options, params);
					}
					options.success = function (data) {
						self.dform(data);
						if(success) {
							success.call(self, data);
						}
					}
					$.ajax(options);
				},
				/**
				 *
				 *
				 * @param options
				 */
				init : function (options, converter) {
					var opts = options.type ? options : $.extend({ "type" : "form" }, options);
					if (converter && $.dform.converters && $.isFunction($.dform.converters[converter])) {
						opts = $.dform.converters[converter](opts);
					}
					if (this.is(opts.type)) {
						this.dform('attr', opts);
						this.dform('run', opts);
					} else {
						this.dform('append', opts);
					}
				}
			}
		}
	});

	/**
	 * The jQuery plugin function
	 *
	 * @param options The form options
	 * @param {String} converter The name of the converter in $.dform.converters
	 * that will be used to convert the options
	 */
	$.fn.dform = function (options, converter, error) {
		var self = $(this);
		if ($.dform.methods[options]) {
			$.dform.methods[options].apply(self, Array.prototype.slice.call(arguments, 1));
		} else {
			if (typeof options === 'string') {
				$.dform.methods.ajax.call(self, {
					url : options,
					dataType : 'json'
				}, converter, error);
			} else {
				$.dform.methods.init.apply(self, arguments);
			}
		}
		return this;
	}
})(jQuery);

/*
 * jQuery dform plugin
 * Copyright (C) 2012 David Luecke <daff@neyeon.com>, [http://daffl.github.com/jquery.dform]
 *
 * Licensed under the MIT license
 */
(function ($) {
	var each = $.each,
		_element = function (tag, excludes) {
			return function (ops) {
				return $(tag).dform('attr', ops, excludes);
			};
		},
		_html = function (options, type) {
			var self = this;
			if ($.isPlainObject(options)) {
				self.dform('append', options);
			} else if ($.isArray(options)) {
				each(options, function (index, nested) {
					self.dform('append', nested);
				});
			} else {
				self.html(options);
			}
		};

	$.dform.addType({
		container : _element("<div>"),
		text : _element('<input type="text" />'),
		password : _element('<input type="password" />'),
		submit : _element('<input type="submit" />'),
		reset : _element('<input type="reset" />'),
		hidden : _element('<input type="hidden" />'),
		radio : _element('<input type="radio" />'),
		checkbox : _element('<input type="checkbox" />'),
		file : _element('<input type="file" />'),
		number : _element('<input type="number" />'),
		url : _element('<input type="url" />'),
		tel : _element('<input type="tel" />'),
		email : _element('<input type="email" />'),
		checkboxes : _element("<div>", ["name"]),
		radiobuttons : _element("<div>", ["name"])
	});

	$.dform.subscribe({
		/**
		 * Adds a class to the current element.
		 * Ovverrides the default behaviour which would be replacing the class attribute.
		 *
		 * @param options A list of whitespace separated classnames
		 * @param type The type of the *this* element
		 */
		"class" : function (options, type) {
			this.addClass(options);
		},

		/**
		 * Sets html content of the current element
		 *
		 * @param options The html content to set as a string
		 * @param type The type of the *this* element
		 */
		"html" : _html,

		/**
		 * Recursively appends subelements to the current form element.
		 *
		 * @param options Either an object with key value pairs
		 *	 where the key is the element name and the value the
		 *	 subelement options or an array of objects where each object
		 *	 is the options for a subelement
		 * @param type The type of the *this* element
		 */
		"elements" : _html,

		/**
		 * Sets the value of the current element.
		 *
		 * @param options The value to set
		 * @param type The type of the *this* element
		 */
		"value" : function (options) {
			this.val(options);
		},

		/**
		 * Set CSS styles for the current element
		 *
		 * @param options The Styles to set
		 * @param type The type of the *this* element
		 */
		"css" : function (options) {
			this.css(options);
		},

		/**
		 * Adds options to select type elements or radio and checkbox list elements.
		 *
		 * @param options A key value pair where the key is the
		 *	 option value and the value the options text or the settings for the element.
		 * @param type The type of the *this* element
		 */
		"options" : function (options, type) {
			var self = this;
			// Options for select elements
			if ((type === "select" || type === "optgroup") && typeof options !== 'string')
			{
				each(options, function (value, content) {
					var option = { type : 'option', value : value };
					if (typeof (content) === "string") {
						option.html = content;
					}
					if (typeof (content) === "object") {
						option = $.extend(option, content);
					}
					self.dform('append', option);
				});
			}
			else if (type === "checkboxes" || type === "radiobuttons") {
				// Options for checkbox and radiobutton lists
				each(options, function (value, content) {
					var boxoptions = ((type === "radiobuttons") ? { "type" : "radio" } : { "type" : "checkbox" });
					if (typeof(content) === "string") {
						boxoptions["caption"] = content;
					} else {
						$.extend(boxoptions, content);
					}
					boxoptions["value"] = value;
					self.dform('append', boxoptions);
				});
			}
		},

		/**
		 * Adds caption to elements.
		 *
		 * Depending on the element type the following elements will
		 * be used:
		 * - A legend for <fieldset> elements
		 * - A <label> next to <radio> or <checkbox> elements
		 * - A <label> before any other element
		 *
		 * @param options A string for the caption or the options for the
		 * @param type The type of the *this* element
		 */
		"caption" : function (options, type) {
			var ops = {};
			if (typeof (options) === "string") {
				ops["html"] = options;
			} else {
				$.extend(ops, options);
			}

			if (type == "fieldset") {
				// Labels for fieldsets are legend
				ops.type = "legend";
				this.dform('append', ops);
			} else {
				ops.type = "label";
				if (this.attr("id")) {
					ops["for"] = this.attr("id");
				}
				var label = $($.dform.createElement(ops));
				if (type === "checkbox" || type === "radio") {
					this.parent().append($(label));
				} else {
					label.insertBefore(this);
				}
				label.dform('run', ops);
			}
		},

		/**
		 * The subscriber for the type parameter.
		 * Although the type parameter is used to get the correct element
		 * type it is just treated as a simple subscriber otherwise.
		 * Since every element needs a type
		 * parameter feel free to add other type subscribers to do
		 * any processing between [pre] and [post].
		 *
		 * This subscriber adds the auto generated classes according
		 * to the type prefix in $.dform.options.prefix.
		 *
		 * @param options The name of the type
		 * @param type The type of the *this* element
		 */
		"type" : function (options, type) {
			if ($.dform.options.prefix) {
				this.addClass($.dform.options.prefix + type);
			}
		},
		/**
		 * Retrieves JSON data from a URL and creates a sub form.
		 *
		 * @param options
		 * @param type
		 */
		"url" : function (options, type) {
			// TODO this.buildForm(options);
		},

		/**
		 * Post processing function, that will run whenever all other subscribers are finished.
		 *
		 * @param options All options that have been used for
		 * @param type The type of the *this* element
		 */
		"[post]" : function (options, type) {
			if (type === "checkboxes" || type === "radiobuttons") {
				var boxtype = ((type === "checkboxes") ? "checkbox" : "radio");
				this.children("[type=" + boxtype + "]").each(function () {
					$(this).attr("name", options.name);
				});
			}
		}
	});
})(jQuery);

/*
 * jQuery dform plugin
 * Copyright (C) 2012 David Luecke <daff@neyeon.com>, [http://daffl.github.com/jquery.dform]
 * 
 * Licensed under the MIT license
 */
(function($)
{
	var _getOptions = function(type, options)
		{
			return $.withKeys(options, $.keyset($.ui[type]["prototype"]["options"]));
		},
		_get = function(keys, obj) {
			for(var item = obj, i = 0; i < keys.length; i++) {
				item = item[keys[i]];
				if(!item) {
					return null;
				}
			}
			return item;
		}
		
	$.dform.addType("progressbar",
		/**
		 * Returns a jQuery UI progressbar.
		 *
		 * @param options  As specified in the jQuery UI progressbar documentation at
		 * 	http://jqueryui.com/demos/progressbar/
		 */
		function(options)
		{
			return $("<div>").dform('attr', options).progressbar(_getOptions("progressbar", options));
		}, $.isFunction($.fn.progressbar));

	$.dform.addType("slider",
		/**
		 * Returns a slider element.
		 *
		 * @param options As specified in the jQuery UI slider documentation at
		 * 	http://jqueryui.com/demos/slider/
		 */
		function(options)
		{
			return $("<div>").dform('attr', options).slider(_getOptions("slider", options));
		}, $.isFunction($.fn.slider));

	$.dform.addType("accordion",
		/**
		 * Creates an element container for a jQuery UI accordion.
		 *
		 * @param options As specified in the jQuery UI accordion documentation at
		 * 	http://jqueryui.com/demos/accordion/
		 */
		function(options)
		{
			return $("<div>").dform('attr', options);
		}, $.isFunction($.fn.accordion));

	$.dform.addType("tabs",
		/**
		 * Returns a container for jQuery UI tabs.
		 *
		 * @param options The options as in jQuery UI tab
		 */
		function(options)
		{
			return $("<div>").dform('attr', options);
		}, $.isFunction($.fn.tabs));
	
	$.dform.subscribe("entries",
		/**
		 *  Create entries for the accordion type.
		 *  Use the <elements> subscriber to create subelements in each entry.
		 *
		 * @param options All options for the container div. The <caption> will be
		 * 	turned into the accordion or tab title.
		 * @param type The type. This subscriber will only run for accordion
		 */
		function(options, type) {
			if(type == "accordion")
			{
				var scoper = this;
				$.each(options, function(index, options) {
					var el = $.extend({ "type" : "div" }, options);
					$(scoper).dform('append', el);
					if(options.caption) {
						var label = $(scoper).children("div:last").prev();
						label.replaceWith('<h3><a href="#">' + label.html() + '</a></h3>');
					}
				});
			}
		}, $.isFunction($.fn.accordion));

	$.dform.subscribe("entries",
		/**
		 *  Create entries for the accordion type.
		 *  Use the <elements> subscriber to create subelements in each entry.
		 *
		 * @param options All options for the container div. The <caption> will be
		 * 	turned into the accordion or tab title.
		 * @param type The type. This subscriber will only run for accordion
		 */
		function(options, type) {
			if(type == "tabs")
			{
				var scoper = this;
				this.append("<ul>");
				var ul = $(scoper).children("ul:first");
				$.each(options, function(index, options) {
					var id = options.id ? options.id : index;
					$.extend(options, { "type" : "container", "id" : id });
					$(scoper).dform('append', options);
					var label = $(scoper).children("div:last").prev();
					$(label).wrapInner($("<a>").attr("href", "#" + id));
					$(ul).append($("<li>").wrapInner(label));
				});
			}
		}, $.isFunction($.fn.tabs));
		
	$.dform.subscribe("dialog",
		/**
		 * Turns an element into a jQuery UI dialog.
		 *
		 * @param options As specified in the [jQuery UI dialog documentation\(http://jqueryui.com/demos/dialog/)
		 */
		function(options)
		{
			this.dialog(options);
		}, $.isFunction($.fn.dialog));

	$.dform.subscribe("resizable",
		/**
		 * Make the current element resizable.
		 *
		 * @param options As specified in the [jQuery UI resizable documentation](http://jqueryui.com/demos/resizable/)
		 */
		function(options)
		{
			this.resizable(options);
		}, $.isFunction($.fn.resizable));

	$.dform.subscribe("datepicker",
		/**
		 * Adds a jQuery UI datepicker to an element of type text.
		 *
		 * @param options As specified in the [jQuery UI datepicker documentation](http://jqueryui.com/demos/datepicker/)
		 * @param type The type of the element
		 */
		function(options, type)
		{
			if (type == "text") {
				this.datepicker(options);
			}
		}, $.isFunction($.fn.datepicker));

	$.dform.subscribe("autocomplete",
		/**
		 * Adds the autocomplete feature to a text element.
		 *
		 * @param options As specified in the [jQuery UI autotomplete documentation](http://jqueryui.com/demos/autotomplete/)
		 * @param type The type of the element
		 */
		function(options, type)
		{
			if (type == "text") {
				this.autocomplete(options);
			}
		}, $.isFunction($.fn.autocomplete));

	$.dform.subscribe("[post]",
		/**
		 * Post processing subscriber that adds jQuery UI styling classes to
		 * text, textarea, password and fieldset elements as well
		 * as calling .button() on submit or button elements.
		 *
		 * Additionally, accordion and tabs elements will be initialized
		 * with their options.
		 *
		 * @param options All options that have been passed for creating the element
		 * @param type The type of the element
		 */
		function(options, type)
		{
			if (this.parents("form").hasClass("ui-widget"))
			{
				if ((type === "button" || type === "submit") && $.isFunction($.fn.button)) {
					this.button();
				}
				if (!!~$.inArray(type, [ "text", "textarea", "password",
						"fieldset" ])) {
					this.addClass("ui-widget-content ui-corner-all");
				}
			}
			if(type === "accordion" || type === "tabs") {
				this[type](_getOptions(type, options));
			}
		});
	
	$.dform.subscribe("[pre]",
		/**
		 * Add a preprocessing subscriber that calls .validate() on the form,
		 * so that we can add rules to the input elements. Additionally
		 * the jQuery UI highlight classes will be added to the validation
		 * plugin default settings if the form has the ui-widget class.
		 * 
		 * @param options All options that have been used for
		 * creating the current element.
		 * @param type The type of the *this* element
		 */
		function(options, type)
		{
			if(type == "form")
			{
				var defaults = {};
				if(this.hasClass("ui-widget"))
				{
					defaults = {
						highlight: function(input)
						{
							$(input).addClass("ui-state-highlight");
						},
						unhighlight: function(input)
						{
							$(input).removeClass("ui-state-highlight");
						}
					};
				}
				if (typeof (options.validate) == 'object') {
					$.extend(defaults, options.validate);
				}
				this.validate(defaults);
			}
		}, $.isFunction($.fn.validate));

		/**
		 * Adds support for the jQuery validation rulesets.
		 * For types: text, password, textarea, radio, checkbox sets up rules through rules("add", rules) for validation plugin
		 * For type <form> sets up as options object for validate method of validation plugin
		 * For rules of types checkboxes and radiobuttons you should use this subscriber for type form (to see example below)
		 *
		 * @param options
		 * @param type
		 */
	$.dform.subscribe("validate", function(options, type)
		{
			if (type != "form") {
				this.rules("add", options);
			}
		}, $.isFunction($.fn.validate));

	$.dform.subscribe("ajax",
		/**
		 * If the current element is a form, it will be turned into a dynamic form
		 * that can be submitted asynchronously.
		 *
		 * @param options Options as specified in the [jQuery Form plugin documentation](http://jquery.malsup.com/form/#options-object)
		 * @param type The type of the element
		 */
		function(options, type)
		{
			if(type === "form")
			{
				this.ajaxForm(options);
			}
		}, $.isFunction($.fn.ajaxForm));

	$.dform.subscribe('html',
		/**
		 * Extends the html subscriber that will replace any string with it's translated
		 * equivalent using the jQuery Global plugin. The html content will be interpreted
		 * as an index string where the first part indicates the localize main index and
		 * every following a sub index using getValueAt.
		 *
		 * @param options The dot separated html string to localize
		 * @param type The type of the this element
		 */
		function(options, type)
		{
			if(typeof options === 'string') {
				var keys = options.split('.'),
					translated = Globalize.localize(keys.shift());
				if(translated = _get(keys, translated)) {
					$(this).html(translated);
				}
			}
		}, typeof Globalize !== 'undefined' && $.isFunction(Globalize.localize));

	$.dform.subscribe('options',
		/**
		 * Extends the options subscriber for using internationalized option
		 * lists.
		 *
		 * @param options Options as specified in the <jQuery Form plugin documentation at http://jquery.malsup.com/form/#options-object>
		 * @param type The type of the element.
		 */
		function(options, type)
		{
			if(type === 'select' && typeof(options) === 'string') {
				$(this).html('');
				var keys = options.split('.'),
					optlist = Globalize.localize(keys.shift());
				if(optlist = _get(keys, optlist)) {
					$(this).dform('run', 'options', optlist, type);
				}
			}
		}, typeof Globalize !== 'undefined' && $.isFunction(Globalize.localize));
})(jQuery);


================================================
FILE: dist/jquery.dform-1.1.0.js
================================================
/*
 * jQuery dform plugin
 * Copyright (C) 2012 David Luecke <daff@neyeon.com>, [http://daffl.github.com/jquery.dform]
 * 
 * Licensed under the MIT license
 */
(function ($) {
	var _subscriptions = {},
		_types = {},
		each = $.each,
		addToObject = function (obj) {
			var result = function (data, fn, condition) {
				if (typeof data === 'object') {
					$.each(data, function (name, val) {
						result(name, val, condition);
					});
				} else if (condition === undefined || condition === true) {
					if (!obj[data]) {
						obj[data] = [];
					}
					obj[data].push(fn);
				}
			}
			return result;
		},
		isArray = $.isArray,
		/**
		 * Returns an array of keys (properties) contained in the given object.
		 *
		 * @param {Object} object The object to use
		 * @return {Array} An array containing all properties in the object
		 */
		keyset = function (object) {
			return $.map(object, function (val, key) {
				return key;
			});
		},
		/**
		 * Returns an object that contains all values from the given
		 * object that have a key which is also in the array keys.
		 *
		 * @param {Object} object The object to traverse
		 * @param {Array} keys The keys the new object should contain
		 * @return {Object} A new object containing only the properties
		 * with names given in keys
		 */
		withKeys = function (object, keys) {
			var result = {};
			each(keys, function (index, value) {
				if (object[value]) {
					result[value] = object[value];
				}
			});
			return result;
		},
		/**
		 * Returns an object that contains all value from the given
		 * object that do not have a key which is also in the array keys.
		 *
		 * @param {Object} object The object to traverse
		 * @param {Array} keys A list of keys that should not be contained in the new object
		 * @return {Object} A new object with all properties of the given object, except
		 * for the ones given in the list of keys
		 */
		withoutKeys = function (object, keys) {
			var result = {};
			each(object, function (index, value) {
				if (!~$.inArray(index, keys)) {
					result[index] = value;
				}
			});
			return result;
		},
		/**
		 * Run all subscriptions with the given name and options
		 * on an element.
		 *
		 * @param {String} name The name of the subscriber function
		 * @param {Object} options ptions for the function
		 * @param {String} type The type of the current element as in the registered types
		 * @return {Object} The jQuery object
		 */
		runSubscription = function (name, options, type) {
			if ($.dform.hasSubscription(name)) {
				this.each(function () {
					var element = $(this);
					each(_subscriptions[name], function (i, sfn) {
						// run subscriber function with options
						sfn.call(element, options, type);
					});
				});
			}
			return this;
		},
		/**
		 * Run all subscription functions with given options.
		 *
		 * @param {Object} options The options to use
		 * @return {Object} The jQuery element this function has been called on
		 */
		runAll = function (options) {
			var type = options.type, self = this;
			// Run preprocessing subscribers
			this.dform('run', '[pre]', options, type);
			each(options, function (name, sopts) {
				self.dform('run', name, sopts, type);
			});
			// Run post processing subscribers
			this.dform('run', '[post]', options, type);
			return this;
		};

	/**
	 * Globals added directly to the jQuery object
	 */
	$.extend($, {
		keyset : keyset,
		withKeys : withKeys,
		withoutKeys : withoutKeys,
		dform : {
			/**
			 * Default options the plugin is initialized with:
			 *
			 * ## prefix
			 *
			 * The Default prefix used for element classnames generated by the dform plugin.
			 * Defaults to _ui-dform-_
			 * E.g. an element with type text will have the class ui-dform-text
			 *
			 */
			options : {
				prefix : "ui-dform-"
			},

			/**
			 * A function that is called, when no registered type has been found.
			 * The default behaviour returns an HTML element with the tag
			 * as specified in type and the HTML attributes given in options
			 * (without subscriber options).
			 *
			 * @param {Object} options
			 * @return {Object} The created object
			 */
			defaultType : function (options) {
				return $("<" + options.type + ">").dform('attr', options);
			},
			/**
			 * Return all types.
			 *
			 * @params {String} name (optional) If passed return
			 * all type generators for a given name.
			 * @return {Object} Mapping from type name to
			 * an array of generator functions.
			 */
			types : function (name) {
				return name ? _types[name ] : _types;
			},
			/**
			 * Register an element type function.
			 *
			 * @param {String|Array} data Can either be the name of the type
			 * function or an object that contains name : type function pairs
			 * @param {Function} fn The function that creates a new type element
			 */
			addType : addToObject(_types),
			/**
			 * Returns all subscribers or all subscribers for a given name.
			 *
			 * @params {String} name (optional) If passed return all
			 * subscribers for a given name
			 * @return {Object} Mapping from subscriber names
			 * to an array of subscriber functions.
			 */
			subscribers : function (name) {
				return name ? _subscriptions[name] : _subscriptions;
			},
			/**
			 * Register a subscriber function.
			 *
			 * @param {String|Object} data Can either be the name of the subscriber
			 * function or an object that contains name : subscriber function pairs
			 * @param {Function} fn The function to subscribe or nothing if an object is passed for data
			 * @param {Array} deps An optional list of dependencies
			 */
			subscribe : addToObject(_subscriptions),
			/**
			 * Returns if a subscriber function with the given name
			 * has been registered.
			 *
			 * @param {String} name The subscriber name
			 * @return {Boolean} True if the given name has at least one subscriber registered,
			 *     false otherwise
			 */
			hasSubscription : function (name) {
				return _subscriptions[name] ? true : false;
			},
			/**
			 * Create a new element.
			 *
			 * @param {Object} options - The options to use
			 * @return {Object} The element as created by the builder function specified
			 *     or returned by the defaultType function.
			 */
			createElement : function (options) {
				if (!options.type) {
					throw "No element type given! Must always exist.";
				}
				var type = options.type,
					element = null,
				// We don't need the type key in the options
					opts = $.withoutKeys(options, ["type"]);

				if (_types[type]) {
					// Run all type element builder functions called typename
					each(_types[type], function (i, sfn) {
						element = sfn.call(element, opts);
					});
				} else {
					// Call defaultType function if no type was found
					element = $.dform.defaultType(options);
				}
				return $(element);
			},
			methods : {
				/**
				 * Run all subscriptions with the given name and options
				 * on an element.
				 *
				 * @param {String} name The name of the subscriber function
				 * @param {Object} options ptions for the function
				 * @param {String} type The type of the current element as in the registered types
				 * @return {Object} The jQuery object
				 */
				run : function (name, options, type) {
					if (typeof name !== 'string') {
						return runAll.call(this, name);
					}
					return runSubscription.call(this, name, options, type);
				},
				/**
				 * Creates a form element on an element with given options
				 *
				 * @param {Object} options The options to use
				 * @return {Object} The jQuery element this function has been called on
				 */
				append : function (options, converter) {
					if (converter && $.dform.converters && $.isFunction($.dform.converters[converter])) {
						options = $.dform.converters[converter](options);
					}
					// Create element (run builder function for type)
					var element = $.dform.createElement(options);
					this.append(element);
					// Run all subscriptions
					element.dform('run', options);
				},
				/**
				 * Adds HTML attributes to the current element from the given options.
				 * Any subscriber will be omitted so that the attributes will contain any
				 * key value pair where the key is not the name of a subscriber function
				 * and is not in the string array excludes.
				 *
				 * @param {Object} object The attribute object
				 * @param {Array} excludes A list of keys that should also be excluded
				 * @return {Object} The jQuery object of the this reference
				 */
				attr : function (object, excludes) {
					// Ignore any subscriber name and the objects given in excludes
					var ignores = $.keyset(_subscriptions);
					isArray(excludes) && $.merge(ignores, excludes);
					this.attr($.withoutKeys(object, ignores));
				},
				/**
				 *
				 *
				 * @param params
				 * @param success
				 * @param error
				 */
				ajax : function (params, success, error) {
					var options = {
						error : error,
						url : params
					}, self = this;
					if (typeof params !== 'string') {
						$.extend(options, params);
					}
					options.success = function (data) {
						var callback = success || params.success;
						self.dform(data);
						if(callback) {
							callback.call(self, data);
						}
					}
					$.ajax(options);
				},
				/**
				 *
				 *
				 * @param options
				 */
				init : function (options, converter) {
					var opts = options.type ? options : $.extend({ "type" : "form" }, options);
					if (converter && $.dform.converters && $.isFunction($.dform.converters[converter])) {
						opts = $.dform.converters[converter](opts);
					}
					if (this.is(opts.type)) {
						this.dform('attr', opts);
						this.dform('run', opts);
					} else {
						this.dform('append', opts);
					}
				}
			}
		}
	});

	/**
	 * The jQuery plugin function
	 *
	 * @param options The form options
	 * @param {String} converter The name of the converter in $.dform.converters
	 * that will be used to convert the options
	 */
	$.fn.dform = function (options, converter, error) {
		var self = $(this);
		if ($.dform.methods[options]) {
			$.dform.methods[options].apply(self, Array.prototype.slice.call(arguments, 1));
		} else {
			if (typeof options === 'string') {
				$.dform.methods.ajax.call(self, {
					url : options,
					dataType : 'json'
				}, converter, error);
			} else {
				$.dform.methods.init.apply(self, arguments);
			}
		}
		return this;
	}
})(jQuery);

/*
 * jQuery dform plugin
 * Copyright (C) 2012 David Luecke <daff@neyeon.com>, [http://daffl.github.com/jquery.dform]
 *
 * Licensed under the MIT license
 */
(function ($) {
	var each = $.each,
		_element = function (tag, excludes) {
			return function (ops) {
				return $(tag).dform('attr', ops, excludes);
			};
		},
		_html = function (options, type) {
			var self = this;
			if ($.isPlainObject(options)) {
				self.dform('append', options);
			} else if ($.isArray(options)) {
				each(options, function (index, nested) {
					self.dform('append', nested);
				});
			} else {
				self.html(options);
			}
		};

	$.dform.addType({
		container : _element("<div>"),
		text : _element('<input type="text" />'),
		password : _element('<input type="password" />'),
		submit : _element('<input type="submit" />'),
		reset : _element('<input type="reset" />'),
		hidden : _element('<input type="hidden" />'),
		radio : _element('<input type="radio" />'),
		checkbox : _element('<input type="checkbox" />'),
		file : _element('<input type="file" />'),
		number : _element('<input type="number" />'),
		url : _element('<input type="url" />'),
		tel : _element('<input type="tel" />'),
		email : _element('<input type="email" />'),
		checkboxes : _element("<div>", ["name"]),
		radiobuttons : _element("<div>", ["name"])
	});

	$.dform.subscribe({
		/**
		 * Adds a class to the current element.
		 * Ovverrides the default behaviour which would be replacing the class attribute.
		 *
		 * @param options A list of whitespace separated classnames
		 * @param type The type of the *this* element
		 */
		"class" : function (options, type) {
			this.addClass(options);
		},

		/**
		 * Sets html content of the current element
		 *
		 * @param options The html content to set as a string
		 * @param type The type of the *this* element
		 */
		"html" : _html,

		/**
		 * Recursively appends subelements to the current form element.
		 *
		 * @param options Either an object with key value pairs
		 *	 where the key is the element name and the value the
		 *	 subelement options or an array of objects where each object
		 *	 is the options for a subelement
		 * @param type The type of the *this* element
		 */
		"elements" : _html,

		/**
		 * Sets the value of the current element.
		 *
		 * @param options The value to set
		 * @param type The type of the *this* element
		 */
		"value" : function (options) {
			this.val(options);
		},

		/**
		 * Set CSS styles for the current element
		 *
		 * @param options The Styles to set
		 * @param type The type of the *this* element
		 */
		"css" : function (options) {
			this.css(options);
		},

		/**
		 * Adds options to select type elements or radio and checkbox list elements.
		 *
		 * @param options A key value pair where the key is the
		 *	 option value and the value the options text or the settings for the element.
		 * @param type The type of the *this* element
		 */
		"options" : function (options, type) {
			var self = this;
			// Options for select elements
			if ((type === "select" || type === "optgroup") && typeof options !== 'string')
			{
				each(options, function (value, content) {
					var option = { type : 'option', value : value };
					if (typeof (content) === "string") {
						option.html = content;
					}
					if (typeof (content) === "object") {
						option = $.extend(option, content);
					}
					self.dform('append', option);
				});
			}
			else if (type === "checkboxes" || type === "radiobuttons") {
				// Options for checkbox and radiobutton lists
				each(options, function (value, content) {
					var boxoptions = ((type === "radiobuttons") ? { "type" : "radio" } : { "type" : "checkbox" });
					if (typeof(content) === "string") {
						boxoptions["caption"] = content;
					} else {
						$.extend(boxoptions, content);
					}
					boxoptions["value"] = value;
					self.dform('append', boxoptions);
				});
			}
		},

		/**
		 * Adds caption to elements.
		 *
		 * Depending on the element type the following elements will
		 * be used:
		 * - A legend for <fieldset> elements
		 * - A <label> next to <radio> or <checkbox> elements
		 * - A <label> before any other element
		 *
		 * @param options A string for the caption or the options for the
		 * @param type The type of the *this* element
		 */
		"caption" : function (options, type) {
			var ops = {};
			if (typeof (options) === "string") {
				ops["html"] = options;
			} else {
				$.extend(ops, options);
			}

			if (type == "fieldset") {
				// Labels for fieldsets are legend
				ops.type = "legend";
				this.dform('append', ops);
			} else {
				ops.type = "label";
				if (this.attr("id")) {
					ops["for"] = this.attr("id");
				}
				var label = $($.dform.createElement(ops));
				if (type === "checkbox" || type === "radio") {
					this.parent().append($(label));
				} else {
					label.insertBefore(this);
				}
				label.dform('run', ops);
			}
		},

		/**
		 * The subscriber for the type parameter.
		 * Although the type parameter is used to get the correct element
		 * type it is just treated as a simple subscriber otherwise.
		 * Since every element needs a type
		 * parameter feel free to add other type subscribers to do
		 * any processing between [pre] and [post].
		 *
		 * This subscriber adds the auto generated classes according
		 * to the type prefix in $.dform.options.prefix.
		 *
		 * @param options The name of the type
		 * @param type The type of the *this* element
		 */
		"type" : function (options, type) {
			if ($.dform.options.prefix) {
				this.addClass($.dform.options.prefix + type);
			}
		},
		/**
		 * Retrieves JSON data from a URL and creates a sub form.
		 *
		 * @param options
		 * @param type
		 */
		"url" : function (options) {
			this.dform('ajax', options);
		},
		/**
		 * Post processing function, that will run whenever all other subscribers are finished.
		 *
		 * @param options All options that have been used for
		 * @param type The type of the *this* element
		 */
		"[post]" : function (options, type) {
			if (type === "checkboxes" || type === "radiobuttons") {
				var boxtype = ((type === "checkboxes") ? "checkbox" : "radio");
				this.children("[type=" + boxtype + "]").each(function () {
					$(this).attr("name", options.name);
				});
			}
		}
	});
})(jQuery);

/*
 * jQuery dform plugin
 * Copyright (C) 2012 David Luecke <daff@neyeon.com>, [http://daffl.github.com/jquery.dform]
 * 
 * Licensed under the MIT license
 */
(function($)
{
	var _getOptions = function(type, options)
		{
			return $.withKeys(options, $.keyset($.ui[type]["prototype"]["options"]));
		},
		_get = function(keys, obj) {
			for(var item = obj, i = 0; i < keys.length; i++) {
				item = item[keys[i]];
				if(!item) {
					return null;
				}
			}
			return item;
		}
		
	$.dform.addType("progressbar",
		/**
		 * Returns a jQuery UI progressbar.
		 *
		 * @param options  As specified in the jQuery UI progressbar documentation at
		 * 	http://jqueryui.com/demos/progressbar/
		 */
		function(options)
		{
			return $("<div>").dform('attr', options).progressbar(_getOptions("progressbar", options));
		}, $.isFunction($.fn.progressbar));

	$.dform.addType("slider",
		/**
		 * Returns a slider element.
		 *
		 * @param options As specified in the jQuery UI slider documentation at
		 * 	http://jqueryui.com/demos/slider/
		 */
		function(options)
		{
			return $("<div>").dform('attr', options).slider(_getOptions("slider", options));
		}, $.isFunction($.fn.slider));

	$.dform.addType("accordion",
		/**
		 * Creates an element container for a jQuery UI accordion.
		 *
		 * @param options As specified in the jQuery UI accordion documentation at
		 * 	http://jqueryui.com/demos/accordion/
		 */
		function(options)
		{
			return $("<div>").dform('attr', options);
		}, $.isFunction($.fn.accordion));

	$.dform.addType("tabs",
		/**
		 * Returns a container for jQuery UI tabs.
		 *
		 * @param options The options as in jQuery UI tab
		 */
		function(options)
		{
			return $("<div>").dform('attr', options);
		}, $.isFunction($.fn.tabs));
	
	$.dform.subscribe("entries",
		/**
		 *  Create entries for the accordion type.
		 *  Use the <elements> subscriber to create subelements in each entry.
		 *
		 * @param options All options for the container div. The <caption> will be
		 * 	turned into the accordion or tab title.
		 * @param type The type. This subscriber will only run for accordion
		 */
		function(options, type) {
			if(type == "accordion")
			{
				var scoper = this;
				$.each(options, function(index, options) {
					var el = $.extend({ "type" : "div" }, options);
					$(scoper).dform('append', el);
					if(options.caption) {
						var label = $(scoper).children("div:last").prev();
						label.replaceWith('<h3><a href="#">' + label.html() + '</a></h3>');
					}
				});
			}
		}, $.isFunction($.fn.accordion));

	$.dform.subscribe("entries",
		/**
		 *  Create entries for the accordion type.
		 *  Use the <elements> subscriber to create subelements in each entry.
		 *
		 * @param options All options for the container div. The <caption> will be
		 * 	turned into the accordion or tab title.
		 * @param type The type. This subscriber will only run for accordion
		 */
		function(options, type) {
			if(type == "tabs")
			{
				var scoper = this;
				this.append("<ul>");
				var ul = $(scoper).children("ul:first");
				$.each(options, function(index, options) {
					var id = options.id ? options.id : index;
					$.extend(options, { "type" : "container", "id" : id });
					$(scoper).dform('append', options);
					var label = $(scoper).children("div:last").prev();
					$(label).wrapInner($("<a>").attr("href", "#" + id));
					$(ul).append($("<li>").wrapInner(label));
				});
			}
		}, $.isFunction($.fn.tabs));
		
	$.dform.subscribe("dialog",
		/**
		 * Turns an element into a jQuery UI dialog.
		 *
		 * @param options As specified in the [jQuery UI dialog documentation\(http://jqueryui.com/demos/dialog/)
		 */
		function(options)
		{
			this.dialog(options);
		}, $.isFunction($.fn.dialog));

	$.dform.subscribe("resizable",
		/**
		 * Make the current element resizable.
		 *
		 * @param options As specified in the [jQuery UI resizable documentation](http://jqueryui.com/demos/resizable/)
		 */
		function(options)
		{
			this.resizable(options);
		}, $.isFunction($.fn.resizable));

	$.dform.subscribe("datepicker",
		/**
		 * Adds a jQuery UI datepicker to an element of type text.
		 *
		 * @param options As specified in the [jQuery UI datepicker documentation](http://jqueryui.com/demos/datepicker/)
		 * @param type The type of the element
		 */
		function(options, type)
		{
			if (type == "text") {
				this.datepicker(options);
			}
		}, $.isFunction($.fn.datepicker));

	$.dform.subscribe("autocomplete",
		/**
		 * Adds the autocomplete feature to a text element.
		 *
		 * @param options As specified in the [jQuery UI autotomplete documentation](http://jqueryui.com/demos/autotomplete/)
		 * @param type The type of the element
		 */
		function(options, type)
		{
			if (type == "text") {
				this.autocomplete(options);
			}
		}, $.isFunction($.fn.autocomplete));

	$.dform.subscribe("[post]",
		/**
		 * Post processing subscriber that adds jQuery UI styling classes to
		 * text, textarea, password and fieldset elements as well
		 * as calling .button() on submit or button elements.
		 *
		 * Additionally, accordion and tabs elements will be initialized
		 * with their options.
		 *
		 * @param options All options that have been passed for creating the element
		 * @param type The type of the element
		 */
		function(options, type)
		{
			if (this.parents("form").hasClass("ui-widget"))
			{
				if ((type === "button" || type === "submit") && $.isFunction($.fn.button)) {
					this.button();
				}
				if (!!~$.inArray(type, [ "text", "textarea", "password",
						"fieldset" ])) {
					this.addClass("ui-widget-content ui-corner-all");
				}
			}
			if(type === "accordion" || type === "tabs") {
				this[type](_getOptions(type, options));
			}
		});
	
	$.dform.subscribe("[pre]",
		/**
		 * Add a preprocessing subscriber that calls .validate() on the form,
		 * so that we can add rules to the input elements. Additionally
		 * the jQuery UI highlight classes will be added to the validation
		 * plugin default settings if the form has the ui-widget class.
		 * 
		 * @param options All options that have been used for
		 * creating the current element.
		 * @param type The type of the *this* element
		 */
		function(options, type)
		{
			if(type == "form")
			{
				var defaults = {};
				if(this.hasClass("ui-widget"))
				{
					defaults = {
						highlight: function(input)
						{
							$(input).addClass("ui-state-highlight");
						},
						unhighlight: function(input)
						{
							$(input).removeClass("ui-state-highlight");
						}
					};
				}
				if (typeof (options.validate) == 'object') {
					$.extend(defaults, options.validate);
				}
				this.validate(defaults);
			}
		}, $.isFunction($.fn.validate));

		/**
		 * Adds support for the jQuery validation rulesets.
		 * For types: text, password, textarea, radio, checkbox sets up rules through rules("add", rules) for validation plugin
		 * For type <form> sets up as options object for validate method of validation plugin
		 * For rules of types checkboxes and radiobuttons you should use this subscriber for type form (to see example below)
		 *
		 * @param options
		 * @param type
		 */
	$.dform.subscribe("validate", function(options, type)
		{
			if (type != "form") {
				this.rules("add", options);
			}
		}, $.isFunction($.fn.validate));

	$.dform.subscribe("ajax",
		/**
		 * If the current element is a form, it will be turned into a dynamic form
		 * that can be submitted asynchronously.
		 *
		 * @param options Options as specified in the [jQuery Form plugin documentation](http://jquery.malsup.com/form/#options-object)
		 * @param type The type of the element
		 */
		function(options, type)
		{
			if(type === "form")
			{
				this.ajaxForm(options);
			}
		}, $.isFunction($.fn.ajaxForm));

	$.dform.subscribe('html',
		/**
		 * Extends the html subscriber that will replace any string with it's translated
		 * equivalent using the jQuery Global plugin. The html content will be interpreted
		 * as an index string where the first part indicates the localize main index and
		 * every following a sub index using getValueAt.
		 *
		 * @param options The dot separated html string to localize
		 * @param type The type of the this element
		 */
		function(options, type)
		{
			if(typeof options === 'string') {
				var keys = options.split('.'),
					translated = Globalize.localize(keys.shift());
				if(translated = _get(keys, translated)) {
					$(this).html(translated);
				}
			}
		}, typeof Globalize !== 'undefined' && $.isFunction(Globalize.localize));

	$.dform.subscribe('options',
		/**
		 * Extends the options subscriber for using internationalized option
		 * lists.
		 *
		 * @param options Options as specified in the <jQuery Form plugin documentation at http://jquery.malsup.com/form/#options-object>
		 * @param type The type of the element.
		 */
		function(options, type)
		{
			if(type === 'select' && typeof(options) === 'string') {
				$(this).html('');
				var keys = options.split('.'),
					optlist = Globalize.localize(keys.shift());
				if(optlist = _get(keys, optlist)) {
					$(this).dform('run', 'options', optlist, type);
				}
			}
		}, typeof Globalize !== 'undefined' && $.isFunction(Globalize.localize));
})(jQuery);


================================================
FILE: package.json
================================================
{
  "name": "jquery.dform",
  "description": "A flexible JavaScript Object and JSON to HTML converter with a focus on forms",
  "version": "1.1.0",
  "homepage": "http://daffl.github.com/jquery.dform",
  "author": "David Luecke",
  "license": "MIT",
  "scripts": {
    "test": "grunt test"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/daffl/jquery.dform.git"
  },
  "devDependencies": {
    "grunt": "^0.4.5",
    "grunt-cli": "^0.1.13",
    "grunt-contrib-concat": "^0.5.1",
    "grunt-contrib-connect": "^0.9.0",
    "grunt-contrib-qunit": "^0.5.2",
    "grunt-contrib-uglify": "^0.8.0"
  }
}


================================================
FILE: readme.md
================================================
The jQuery.dForm plugin generates HTML markup from JavaScript objects and [JSON](http://json.org)
with a focus on HTML forms.

__Some things you can do:__

* naturally generate JavaScript enhanced markup with your own extensions and custom types
* use JavaScript and JSON instead of HTML markup since your page doesn't run without JS anyway
* have an easy way to include jQuery UI elements and other jQuery plugins (some supported out of the box)
* scaffold forms from business objects of your server side framework

## Get started

[Download the latest version 1.1.0](https://raw.github.com/daffl/jquery.dform/master/dist/jquery.dform-1.1.0.js)
([min](https://raw.github.com/daffl/jquery.dform/master/dist/jquery.dform-1.1.0.min.js))
(~7 Kb minified)

Include it in your jQuery powered page and try this:

	<script type="text/javascript">
		$(function() {
		  // Generate a form
			$("#myform").dform({
			    "action" : "index.html",
			    "method" : "get",
			    "html" :
			    [
			        {
			            "type" : "p",
			            "html" : "You must login"
			        },
			        {
			            "name" : "username",
			            "id" : "txt-username",
			            "caption" : "Username",
			            "type" : "text",
			            "placeholder" : "E.g. user@example.com"
			        },
			        {
			            "name" : "password",
			            "caption" : "Password",
			            "type" : "password"
			        },
			        {
			            "type" : "submit",
			            "value" : "Login"
			        }
			    ]
			});
		});
	</script>
	<form id="myform"></form>

Or to quickly load an external form definition:

	<script type="text/javascript">
		$(function() {
		  // Load the form object from path/to/form.json
			$("#myform").dform('path/to/form.json', function(data) {
			  this //-> Generated $('#myform')
			  data //-> data from path/to/form.json
			});
		});
	</script>
	<form id="myform"></form>


__Demo:__

<iframe style="width: 100%; height: 300px" src="http://jsfiddle.net/Daff/Zt4Rz/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe>

__Learn more:__

* Visit the above example [on jsfiddle.com](http://jsfiddle.net/Daff/Zt4Rz/)
* Watch and fork the project on [GitHub](http://github.com/daffl/jquery.dform/)
* Follow [@daffl](http://twitter.com/daffl) on Twitter
* Read on in this documentation

## Types

Type generators are functions that return a new jQuery DOM object for a specific type. If there is no type generator
for that type, a basic HTML tag with that name will be created. Every other key in the JavaScript object
you pass (the dForm object) will be used as an HTML attribute, except if there is a [subscriber](#subscribers)
registered for that key. A plugin call like this:

	$('#my-div').dform({
		type : "span",
		id : "the-span"
	});

Will append an empty `<span id="the-span"></span>` to the selected element.

### Core types

Besides standard HTML tags the following core types are supported:

**container** `{ "type" : "container" }`<br />
Creates a `<div>` container (you can also use `{ "type" : "div" }`)

**text** `{ "type" : "text" }`<br />
Creates a text input field

**password** `{ "type" : "password" }`<br />
Creates a password input field

**submit** `{ "type" : "submit" }`<br />
Creates a submit button input element

**reset** `{ "type" : "reset" }`<br />
Creates a reset button input element

**hidden** `{ "type" : "hidden" }`<br />
Creates a hidden input element

**file** `{ "type" : "file" }`<br />
Create a file upload field

**radio** `{ "type" : "radio" }`<br />
Creates a radio button

**checkbox** `{ "type" : "checkbox" }`<br />
Creates a checkbox

**radiobuttons** `{ "type" : "radiobuttons" }`<br />
Creates a group of radiobuttons (uses *options* subscriber explained below)

**checkboxes** `{ "type" : "checkboxes" }`<br />
Creates a group of checkboxes (uses *options* subscriber explained below)

**number** `{ "type" : "number" }`<br />
Creates an HTML 5 number input field

**url** `{ "type" : "url" }`<br />
Creates an HTML 5 url input field

**tel** `{ "type" : "tel" }`<br />
Creates an HTML 5 phone number input field

**email** `{ "type" : "email" }`<br />
Creates an HTML 5 email input field

### Add your own

You can add your own types by calling  `$.dform.addType` and pass the type name and a function
that takes the dForm object as a parameter and returns a new jQuery DOM element:

	$.dform.addType("hellobutton", function(options) {
		// Return a new button element that has all options that
		// don't have a registered subscriber as attributes
		return $("<button>").dform('attr', options).html("Say hello");
	});

The type generator uses the *attr* [plugin method](#plugin-methods) to add the proper HTML attributes to the button.
Now the new type can be used like this:

	$('#myform').dform({
		"type" : "hellobutton",
		"id" : "my-button"
	});

Which generates:

	<button id="my-button" class="ui-dform-hellobutton">Say hello</button>

Type generators can be chained. That means, that if you add a type that already exists `this` in the generator function
will refer to the element returned by its previous generator:

	$.dform.addType("text", function(options) {
		return $(this).addClass('my-textfield-class');
	});

	$('#myform').dform({
		type : 'text'
	});

Now generates

	<input type="text" class="ui-dform-text my-textfield-class" />

## Subscribers

While type generators are being used to generate a base element for the given type, subscribers attach to
certain attributes in the dForm object. When traversing the object, all subscribers registered for that
key will be executed on the current element.

### Core subscribers

**class** *{String}*<br />
Adds a class to the current element (instead of setting the attribute) using [.addClass()](http://api.jquery.com/addClass).

	{
		"type" : "div",
		"class" : "the-div container"
	}

Generates:

	<div class="ui-dform-div the-div container"></div>

**html/elements** *{String|Array|Object}*<br />
Based on the options it either sets the HTML string content of the current element or appends one or an array
of dForm objects. The *elements* subscriber does the same but is kept for backwards compatibility.

	{
        "type" : "div",
        "html" : "Div content"
    }

Generates:

	<div class="ui-dform-div">Div content</div>

This subscriber can also be used to create nested objects by using one or an array of dForm objects:

	{
		"type" : "div",
		"html" :
		[
			{
				"type" : "text"
			},
			{
				"type" : "div",
				"html" : {
					"type" : "p",
					"html" : "A paragraph"
				}
			}
		]
	}

Generates:

	<div class="ui-dform-div">
		<input type="text" class="ui-dform-text" />
		<div class="ui-dform-div">
			<p class="ui-dform-p">A paragraph</p>
		</div>
	</div>

**value** *{String|Function}*<br />
Sets the value of the element using [.val()](http://api.jquery.com/val/)

	{
		"type" : "text",
		"value" : "Text content"
	}

Generates:

	<input type="text" value="Text content" />

**css** {Object}<br />
Sets CSS properties on an element using [.css()](http://api.jquery.com/css/):

	{
		"type" : "div",
		"css" : {
			"background-color" : "#FF0000",
			"display" : "none"
		}
	}

Generates:

	<div class="ui-dform-div" style="background-color: #FF0000; display: none;"></div>

**options** *{Object}*<br />
Generates a list of options from a value to text (or dForm Object) mapping for elements of type *select*:

	{
		"type" : "select",
		"options" : {
			"us" : "USA",
			"ca" : "Canada",
			"de" : {
				"selected" : "selected",
				"html" : "Germany"
			}
		}
	}

Generates:

	<select>
		<option value="us">USA</option>
		<option value="ca">Canada</option>
		<option value="de" selected="selected">Germany</option>
	</select>
	
*radiobuttons* and *checkboxes* work similarly:

	{
		"type" : "select",
		"options" : {
			"us" : "USA",
			"ca" : {
				"checked" : "checked",
				"caption" : "Canada"
			},
			"de" : "Germany"
		}
	}
	
To use option groups just pass an object of type *optgroup*:

	{
		"type" : "select",
		"options" : {
		  "northamerica" : {
		    "type" : "optgroup",
		    "label" : "North America",
		    "options" : {
          "us" : "USA",
          "ca" : "Canada"
		    }
		  },
		  "europe" : {
		    "type" : "optgroup",
		    "label" : "Europe",
		    "options" : {
		      "de" : {
            "selected" : "selected",
            "html" : "Germany"
          },
          "fr" : "France"
		    }
		  }
		}
	}

You can also use options on *checkboxes* and *radiobuttons* which will create a list of *checkbox*
or *radio* elements:

	{
		"type" : "checkboxes",
		"options" : {
			"newsletter" : "Receive the newsletter",
			"terms" : "I read the terms of service",
			"update" : "Keep me up to date on new events"
		}
	}

Generates:

	<div class="ui-dform-checkboxes">
		<input type="checkbox" class="ui-dform-checkbox" value="newsletter">
		<label class="ui-dform-label">Receive the newsletter</label>
		<input type="checkbox" class="ui-dform-checkbox" value="terms">
		<label class="ui-dform-label">I read the terms of service</label>
		<input type="checkbox" class="ui-dform-checkbox" value="update">
		<label class="ui-dform-label">Keep me up to date on new events</label>
	</div>

> *Note:* The Google Chrome JavaScript engine V8 orders object keys that can be cast to numbers by their value and
> not by the order of their definition.

**caption** *{String|Object}*<br />
Adds a caption to the element. The type used depends on the element type:

* A *legend* on *fieldset* elements
* A *label* next to *radio* or *checkbox* elements
* A *label* before any other element

If the element has its id set, the *for* attribute of the label will be set as well.

	{
		"type" : "text",
		"name" : "username",
		"id" : "username",
		"caption" : "Enter your username"
	}

Generates:

	<label for="username" class="ui-dform-label">Enter your username</label>
	<input type="text" class="ui-dform-text" id="username" />

For fieldsets:

	{
		"type" : "fieldset",
		"caption" : "Address"
	}

Generates:

	<fieldset class="ui-dform-fieldset">
		<legend type="ui-dform-legend">Address</label>
	</fieldset>

**url** *{String|Object}*<br />
The `url` subscriber issues a `$(element).dform('ajax', options)` request to load content from remote files.

	{
		"type" : "div",
		"url": "form.json"
	}

**type** *{String}*<br />
Besides looking up the correct Type Generator it also adds a dform specific class to the element using
`$.dform.options.prefix` (*ui-dform-* by default) and the type name.

	{
		"type" : "text"
	}

Generates:

	<input type="text" class="ui-dform-text" />

Set `$.dform.options.prefix = null;` if you don't want any classes being added.

### Add your own

It is easy to add your own subscribers. Similar to a type generator you just pass the key name you want to subscribe
to and a function that takes the options and the type name as a parameter to `$.dform.subscribe`. `this` in the
subscriber function will refer to the current element. That way it is possible to add an alert to the
*hellobutton* example created in the [types section](#subscribers/add-your-own):

	$.dform.subscribe("alert", function(options, type) {
		// Just run if the type is a hellobutton
		if(type === "hellobutton") {
			this.click(function() {
				alert(options);
			});
		}
	});

And then you can use the plugin like this:

	$("#mydiv").dform({
		"type" : "hellobutton",
		"alert" : "Hello world!"
	});

Which generates:

	<button class="ui-dform-hellobutton">Say Hello</button>

And alerts "Hello world!" when the button is clicked. Like type generators, subscribers will also be chained.
You can therefore add multiple subscribers with the same name adding behaviour or reacting to different types.

### Special subscribers

Currently there are two types of special subscribers:

**\[pre\]** *{Object}*<br />
Functions registered with this name will be called before any processing occurs and get the original options passed.

**\[post\]** *{Object}*<br />
Functions registered with this name will be called after all processing is finished and also get the original
options passed.

## Plugin

### jQuery plugin methods

The __dform__ plugin function follows the jQuery plugin convention of taking an options object or a
method name as the first parameter to call different methods:

**$(form).dform(options \[, converter\])** *{Object}* *{String}*<br />
Append the dForm object to each selected element. If the element is of the same type (e.g. if you are appending
a `type : 'form'` on a `<form>`) or if no type has been given run the subscribers and
add the attributes on the current element. Optionally use a converter with a given name.

**$(form).dform(url \[, success\], \[, error\])** *{String}* *{Function}* *{Function}*<br />
Load a JSON form definition using GET from a given URL and execute a success handler when it returns
or an error handler if the request faiuls. The handler gets the data passed and has `this` refer to the form element.

**$(form).dform('run', options)** *{Object}*<br />
Run all subscribers from a given dForm object on the selected element(s).

**$(form).dform('run', name, options, type)** *{String}* *{Mixed}* *{String}*<br />
Run a subscriber with a given name and options on the selected element(s) using a specific type.
Usually used internally.

**$(form).dform('append', options \[, converter\])** *{Object}* *{String}*<br />
Append a dForm element to each selected element. Optionally using a converter with the
given name.

**$(form).dform('attr', options)** *{Object}*<br />
Set each attribute from the options object that doesn't have a corresponding subscriber registered.

**$(form).dform('ajax', params \[, success\] \[, error\])** *{Object|String}* *{Function}* *{Function}*<br />
Load a form definition using Ajax. The params take the same options as a
[jQuery Ajax](http://api.jquery.com/jQuery.ajax/) call.

### Static functions

**$.keySet(object)** *{Object}*<br />
Return an array of the objects keys.

**$.withKeys(object, keys)** *{Object}* *{Array}*<br />
Returns a new object that contains all values from the given
object that have a key which is also in the array keys.

**$.withoutKeys(object, keys)** *{Object}* *{Array}*<br />
Returns a new object that contains all value from the given
object that do not have a key which is also in the array keys.

**$.dform.options**<br />
Static options for generating a form. Currently only `$.dform.options.prefix`
is being used.

**$.dform.defaultType(options)** *{Object}*<br />
A type generator that will be used when no other registered type has been found.
The standard generator creates an HTML element according to the type given:

	{
		"type" : "a",
		"href" : "http://daffl.github.com/jquery.dform",
		"html" : "Visit the plugin homepage"
	}

Generates:

	<a class="ui-dform-a" href="http://daffl.github.com/jquery.dform">Visit the plugin homepage</a>

**$.dform.types(\[name\])** *{String}*<br />
Returns all type generators for a given type name. If no name is given, a map of type names
to an array of generator functions will be returned.

**$.dform.addType(name, generator \[, condition\])** *{String}* *{Function}* *{Boolean}*<br />
Add a new type with a given name and generator function which takes the options as the parameter
and returns a new element. Optionally pass a condition which will add the type only if it is true.

**$.dform.subscribe(name, subscriber \[, condition\])** *{String}* *{Function}* *{Boolean}*<br />
Add a new subscriber function for a given name that takes the value and type name as the parameter and will have
`this` set to the current element. Optionally pass as condition which will add the subscriber only if it is true.

**$.dform.subscribers(\[name\])**<br />
Returns all subscribers for a given name. If no name is given, an object containing all subscribers will
be returned.

**$.dform.hasSubscription(name)** *{String}*<br />
Returns if there is at least one subscriber registered with the given name.

**$.dform.createElement(options)** *{Object}*<br />
Returns a new element either using a registered type generator or the default type generator.

## jQuery UI

jQuery.dForm automatically adds support for whichever jQuery UI plugin is available.
If the form has the *ui-widget* class the plugin will automatically turn buttons into jQuery UI buttons and add
corners to *text*, *textarea*, *password* and *fieldset* elements.

> Note: jQuery UI has to be loaded __before__ the dForm plugin.

### Types

Most jQuery UI widgets have an appropriate type generator implemented. Besides normal HTML attributes,
each take the same options as described in [the jQuery UI documentation](http://jqueryui.com/demos/).

**progressbar** `{ "type" : "progressbar" }`<br />
Creates a progressbar. Use the options as described in the
[jQuery UI progressbar documentation](http://jqueryui.com/demos/progressbar/).

	{
		"type" : "progressbar",
		"value" : "20"
	}

**slider** `{ "type" : "slider" }`<br />
Creates a [slider element](http://jqueryui.com/demos/slider/).

	{
		"type" : "slider",
		"step" : 5,
		"value" : 25
	}

**accordion** `{ "type" : "accordion" }`<br />
Creates a container for a jQueryUI accordion. Use the *entries* subscriber to add elements.
You can use any [jQueryUI accordion option](http://jqueryui.com/demos/accordion/) in the definition.
The caption in each entries element will be used as the accordion heading:

    {
      "type" : "accordion",
      "animated" : "bounceslide",
      "entries" : [
        {
          "caption" : "First entry",
          "html" : "Content 1"
        },
        {
          "caption" : "Second entry",
          "html" : "Content 2"
        }
      ]
    }

**tabs** `{ "type" : "tabs" }`<br />
Creates a container for a set of jQuery UI tabs. Use the *entries* subscriber to add elements.
You can use any [jQueryUI tabs option](http://jqueryui.com/demos/tabs/) in the definition.
The caption in each entries element will be used as the tab heading. You can either pass an array
of entries and set the *id* attribute individually or an object which will use the key name as the id:

    {
      "type" : "tabs",
      "entries" : [
        {
          "caption" : "Tab 1",
          "id" : "first",
          "html" : "Content 1"
        },
        {
          "caption" : "Tab 2",
          "id" : "second",
          "html" : "Content 2"
        }
      ]
    }

Which is equivalent to:

    {
      "type" : "tabs",
      "entries" : {
        "first": {
          "caption" : "Tab 1",
          "html" : "Content 1"
        },
        "second" : {
          "caption" : "Tab 2",
          "html" : "Content 2"
        }
      }
    }

### Subscribers

Some other features have been implemented as subscribers:

**entries** *{Object}*<br />
Add entries to an *accordion* or *tabs* element. See the accordion and tabs type documentation for examples.

**dialog** *{Object}*<br />
Turns the current element into a jQueryUI dialog. Pass the [jQueryUI dialog options](http://jqueryui.com/demos/dialog/)
or an empty object for the defaults.

**resizable** *{Object}*<br />
Makes the current element resizable. Pass the [jQueryUI resizable options](http://jqueryui.com/demos/resizable/)
or an empty object for the defaults.

**datepicker** *{Object}*<br />
Adds a datepicker to a text element. Pass the [jQueryUI datepicker options](http://jqueryui.com/demos/datepicker/)
or an empty object for the defaults:

    {
      "type" : "text",
      "datepicker" : {
        "minDate" : "+1"
      }
    }

**autocomplete** *{Object}*<br />
Adds autocomplete functionality to a text element. Pass the [jQueryUI autocomplete options](http://jqueryui.com/demos/autocomplete/).

## Other plugins

### Form validation

jQuery.dForm adds a **validate** subscriber if the [jQuery Form Validation](http://bassistance.de/jquery-plugins/jquery-plugin-validation/)
plugin is available. The options passed are added as [validation rulesets](http://docs.jquery.com/Plugins/Validation/rules#.22add.22rules)
to the element:

	{
		"type" : "text",
		"validate" : {
			"required" : true,
			"minlength" : 2,
			"messages" : {
				"required" : "Required input",
			}
		}
	}

If the form has the *ui-widget* class the jQuery UI CSS error classes will be used to highlight fields.

### jQuery Globalize

[jQuery.Globalize](https://github.com/jquery/globalize) adds internationalization to JavaScript.
If available, the *html* and *options* subscribers will be enabled to use internationalized strings and option lists.
For example with Globalize configured like this:

    Globalize.culture('de');
		Globalize.addCultureInfo( "de", {
      messages: {
        "stuff" : {
          "hello" : "Hallo Welt",
          "options" : {
            "de" : "Deutschland",
            "ca" : "Kanada",
            "fr" : "Frankreich"
          }
        }
      }
    });

You can create an internationalized form like this:

    {
      "type" : "div",
      "html" : "stuff.hello"
    }

Which generates:

    <div class="ui-dform-div">Hallo Welt</div>

And an options list like:

    {
      "type" : "select",
      "options" : "stuff.options"
    }

Generates:

    <select class="ui-dform-select">
      <option value="de">Deutschland</option>
      <option value="ca">Kanada</option>
      <option value="fr">Frankreich</option>
    </select>

## Changelog

__1.1.0__

* Added `url` subscriber ([#22](https://github.com/daffl/jquery.dform/issues/22))
* Better Ajax support ([#35](https://github.com/daffl/jquery.dform/issues/35))
* Added dist files to GitHub pages for better CDN support
* Registered bower package: `bower install jquery.dform`

__1.0.1__

* Updated and fixed documentation
* Added [jQuery plugin](http://plugins.jquery.com) deploy information
* Moved away from GitHub downloads
* Verified jQuery 1.9.0 compatibility

__1.0.0__

* Improved documentation using DocumentUp
* QUnit test suite
* Major API improvements

__0.1.4__

* Merged pull request [#30](https://github.com/daffl/jquery.dform/pull/30):
Wrap 'type' as an array so it doesn't break jQuery 1.7.1's $.inArray() when running in IE8
* Added first QUnit tests
* Fixed issue #22 with jQuery UI accordion causing problems with captions
* Removed placeholder plugin. Use HTML 5 placeholders or the jQuery
[placeholder plugin](https://github.com/danielstocks/jQuery-Placeholder)
* Updated documentation engine to DocumentJS and build system to StealJS
* Merged pull request [#19](https://github.com/daffl/jquery.dform/pull/19) and
[#20](https://github.com/daffl/jquery.dform/pull/20),
support to set up a validate options for validate() in "form" type
* Merged pull request [#26](https://github.com/daffl/jquery.dform/pull/26) to support HTML 5 input types
* Added simple getting started example

__0.1.3__

* Created some public [JSFiddles for trying the plugin](http://jsfiddle.net/user/Daff/fiddles)
* Added *form* type, unified *buildForm* usage
* Fixed [issue #14](https://github.com/daffl/jquery.dform/issues/closed#issue/14), setting type attribute properly in IE
* Added *getValueAt*
* Added *i18n* support using the [jQuery globalize](https://github.com/jquery/jquery-global) plugin
* Fixed minor bugs in dform plugins

__0.1.2__

* Added *dformAttr* to add HTML attributes to elements
* Moved *placeholder* into a separate plugin
* Added *reset* button type
* Added dynamic form definition loading by passing a URL to the *buildForm* plugin function
* Added *ajax* subscriber using the *jQuery form plugin at http://jquery.malsup.com/form*
* Added the *defaultType* method to create any HTML element without having to register a type
* Improved build process

__0.1.1__

* Separated type and subscriber functions
* Added types *file*, *container*, *hidden*, *accordion*, *checkboxes* and *radiobuttons*
* Added auto class generation based on element type
* Finished jQuery UI *accordion* and unified with *tabs* usage
* Switched documentation to *Natualdocs at http://naturaldocs.org*
* Added build.xml for generating documentation and minifying JavaScript

__0.1__

* Initial release

## License

Copyright (C) 2013 [David Luecke](http://daffl.github.com), [http://daffl.github.com/jquery.dform]

The MIT license:

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

[![Build Status](https://secure.travis-ci.org/daffl/jquery.dform.png)](http://travis-ci.org/daffl/jquery.dform)


================================================
FILE: src/dform.converters.js
================================================
/*
 * jQuery dform plugin
 * Copyright (C) 2011 David Luecke <daff@neyeon.de>
 * 
 * Licensed under the MIT license
 */

/**
 * 
 */
(function($)
{
	$.dform.options.converters =
	{
		"json" :
		{
			"types" :
			{
				"boolean" :
				{
					"type" : "checkbox"
				},
				"integer" :
				{
					"type" : "text"
				}
			}
		}
	};

	$.dform.converters =
	{
		"json" : function(data, path)
		{
			var converters = $.dform.options.converters.json.types;
			var getElements = function(obj)
			{
				var result = [];
				$.each(obj, function(key, value)
				{
					var instance = typeof (value);
					var element;
					if($.isArray(value))
					{
						alert(key + ' is an array');
					} else if($.isPlainObject(value))
					{
						element =
						{
							'type' : 'fieldset',
							'caption' : key,
							'elements' : getElements(value)
						};
					}
					else
					{
						var baseElement = converters[instance] || { 'type' : 'text' };
						element = $.extend(baseElement, { 'caption' : key, 'name' : key, 'value' : value });
					}
					result.push(element);
				});
				return result;
			};
			
			return {
				"type" : "form",
				"elements" : getElements(data)
			};
		},

		"json-schema" : function(data)
		{
			var dform =
			{
				elements : []
			};

			for ( var propName in schema.properties)
			{
				var property = schema.properties[propName];
				var type = property.type;
				if (type == "string")
				{
					var value = obj[propName];
					if (!value)
						value = "";
					var element =
					{
						"name" : "ui-form-" + propName,
						"id" : "ui-form-" + propName,
						"caption" : property.title,
						"type" : "text",
						"value" : value
					};
					dform.elements.push(element);
					dform.elements.push(
					{
						"type" : "br"
					});
				} else if (type == "object")
				{
					var element = jsonSchemaToDForm(property, obj);
					element.type = "fieldset";
					element.caption = property.title;
					dform.elements.push(element);
				}
			}
			return dform;
		}
	};
})(jQuery);


================================================
FILE: src/dform.core.js
================================================
/*
 * jQuery dform plugin
 * Copyright (C) 2012 David Luecke <daff@neyeon.com>, [http://daffl.github.com/jquery.dform]
 *
 * Licensed under the MIT license
 */
(function ($) {
	var each = $.each,
		_element = function (tag, excludes) {
			return function (ops) {
				return $(tag).dform('attr', ops, excludes);
			};
		},
		_html = function (options, type) {
			var self = this;
			if ($.isPlainObject(options)) {
				self.dform('append', options);
			} else if ($.isArray(options)) {
				each(options, function (index, nested) {
					self.dform('append', nested);
				});
			} else {
				self.html(options);
			}
		};

	$.dform.addType({
		container : _element("<div>"),
		text : _element('<input type="text" />'),
		password : _element('<input type="password" />'),
		submit : _element('<input type="submit" />'),
		reset : _element('<input type="reset" />'),
		hidden : _element('<input type="hidden" />'),
		radio : _element('<input type="radio" />'),
		checkbox : _element('<input type="checkbox" />'),
		file : _element('<input type="file" />'),
		number : _element('<input type="number" />'),
		url : _element('<input type="url" />'),
		tel : _element('<input type="tel" />'),
		email : _element('<input type="email" />'),
		checkboxes : _element("<div>", ["name"]),
		radiobuttons : _element("<div>", ["name"])
	});

	$.dform.subscribe({
		/**
		 * Adds a class to the current element.
		 * Ovverrides the default behaviour which would be replacing the class attribute.
		 *
		 * @param options A list of whitespace separated classnames
		 * @param type The type of the *this* element
		 */
		"class" : function (options, type) {
			this.addClass(options);
		},

		/**
		 * Sets html content of the current element
		 *
		 * @param options The html content to set as a string
		 * @param type The type of the *this* element
		 */
		"html" : _html,

		/**
		 * Recursively appends subelements to the current form element.
		 *
		 * @param options Either an object with key value pairs
		 *	 where the key is the element name and the value the
		 *	 subelement options or an array of objects where each object
		 *	 is the options for a subelement
		 * @param type The type of the *this* element
		 */
		"elements" : _html,

		/**
		 * Sets the value of the current element.
		 *
		 * @param options The value to set
		 * @param type The type of the *this* element
		 */
		"value" : function (options) {
			this.val(options);
		},

		/**
		 * Set CSS styles for the current element
		 *
		 * @param options The Styles to set
		 * @param type The type of the *this* element
		 */
		"css" : function (options) {
			this.css(options);
		},

		/**
		 * Adds options to select type elements or radio and checkbox list elements.
		 *
		 * @param options A key value pair where the key is the
		 *	 option value and the value the options text or the settings for the element.
		 * @param type The type of the *this* element
		 */
		"options" : function (options, type) {
			var self = this;
			// Options for select elements
			if ((type === "select" || type === "optgroup") && typeof options !== 'string')
			{
				each(options, function (value, content) {
					var option = { type : 'option', value : value };
					if (typeof (content) === "string") {
						option.html = content;
					}
					if (typeof (content) === "object") {
						option = $.extend(option, content);
					}
					self.dform('append', option);
				});
			}
			else if (type === "checkboxes" || type === "radiobuttons") {
				// Options for checkbox and radiobutton lists
				each(options, function (value, content) {
					var boxoptions = ((type === "radiobuttons") ? { "type" : "radio" } : { "type" : "checkbox" });
					if (typeof(content) === "string") {
						boxoptions["caption"] = content;
					} else {
						$.extend(boxoptions, content);
					}
					boxoptions["value"] = value;
					self.dform('append', boxoptions);
				});
			}
		},

		/**
		 * Adds caption to elements.
		 *
		 * Depending on the element type the following elements will
		 * be used:
		 * - A legend for <fieldset> elements
		 * - A <label> next to <radio> or <checkbox> elements
		 * - A <label> before any other element
		 *
		 * @param options A string for the caption or the options for the
		 * @param type The type of the *this* element
		 */
		"caption" : function (options, type) {
			var ops = {};
			if (typeof (options) === "string") {
				ops["html"] = options;
			} else {
				$.extend(ops, options);
			}

			if (type == "fieldset") {
				// Labels for fieldsets are legend
				ops.type = "legend";
				this.dform('append', ops);
			} else {
				ops.type = "label";
				if (this.attr("id")) {
					ops["for"] = this.attr("id");
				}
				var label = $($.dform.createElement(ops));
				if (type === "checkbox" || type === "radio") {
					this.parent().append($(label));
				} else {
					label.insertBefore(this);
				}
				label.dform('run', ops);
			}
		},

		/**
		 * The subscriber for the type parameter.
		 * Although the type parameter is used to get the correct element
		 * type it is just treated as a simple subscriber otherwise.
		 * Since every element needs a type
		 * parameter feel free to add other type subscribers to do
		 * any processing between [pre] and [post].
		 *
		 * This subscriber adds the auto generated classes according
		 * to the type prefix in $.dform.options.prefix.
		 *
		 * @param options The name of the type
		 * @param type The type of the *this* element
		 */
		"type" : function (options, type) {
			if ($.dform.options.prefix) {
				this.addClass($.dform.options.prefix + type);
			}
		},
		/**
		 * Retrieves JSON data from a URL and creates a sub form.
		 *
		 * @param options
		 * @param type
		 */
		"url" : function (options) {
			this.dform('ajax', options);
		},
		/**
		 * Post processing function, that will run whenever all other subscribers are finished.
		 *
		 * @param options All options that have been used for
		 * @param type The type of the *this* element
		 */
		"[post]" : function (options, type) {
			if (type === "checkboxes" || type === "radiobuttons") {
				var boxtype = ((type === "checkboxes") ? "checkbox" : "radio");
				this.children("[type=" + boxtype + "]").each(function () {
					$(this).attr("name", options.name);
				});
			}
		}
	});
})(jQuery);


================================================
FILE: src/dform.extensions.js
================================================
/*
 * jQuery dform plugin
 * Copyright (C) 2012 David Luecke <daff@neyeon.com>, [http://daffl.github.com/jquery.dform]
 * 
 * Licensed under the MIT license
 */
(function($)
{
	var _getOptions = function(type, options)
		{
			return $.withKeys(options, $.keyset($.ui[type]["prototype"]["options"]));
		},
		_get = function(keys, obj) {
			for(var item = obj, i = 0; i < keys.length; i++) {
				item = item[keys[i]];
				if(!item) {
					return null;
				}
			}
			return item;
		}
		
	$.dform.addType("progressbar",
		/**
		 * Returns a jQuery UI progressbar.
		 *
		 * @param options  As specified in the jQuery UI progressbar documentation at
		 * 	http://jqueryui.com/demos/progressbar/
		 */
		function(options)
		{
			return $("<div>").dform('attr', options).progressbar(_getOptions("progressbar", options));
		}, $.isFunction($.fn.progressbar));

	$.dform.addType("slider",
		/**
		 * Returns a slider element.
		 *
		 * @param options As specified in the jQuery UI slider documentation at
		 * 	http://jqueryui.com/demos/slider/
		 */
		function(options)
		{
			return $("<div>").dform('attr', options).slider(_getOptions("slider", options));
		}, $.isFunction($.fn.slider));

	$.dform.addType("accordion",
		/**
		 * Creates an element container for a jQuery UI accordion.
		 *
		 * @param options As specified in the jQuery UI accordion documentation at
		 * 	http://jqueryui.com/demos/accordion/
		 */
		function(options)
		{
			return $("<div>").dform('attr', options);
		}, $.isFunction($.fn.accordion));

	$.dform.addType("tabs",
		/**
		 * Returns a container for jQuery UI tabs.
		 *
		 * @param options The options as in jQuery UI tab
		 */
		function(options)
		{
			return $("<div>").dform('attr', options);
		}, $.isFunction($.fn.tabs));
	
	$.dform.subscribe("entries",
		/**
		 *  Create entries for the accordion type.
		 *  Use the <elements> subscriber to create subelements in each entry.
		 *
		 * @param options All options for the container div. The <caption> will be
		 * 	turned into the accordion or tab title.
		 * @param type The type. This subscriber will only run for accordion
		 */
		function(options, type) {
			if(type == "accordion")
			{
				var scoper = this;
				$.each(options, function(index, options) {
					var el = $.extend({ "type" : "div" }, options);
					$(scoper).dform('append', el);
					if(options.caption) {
						var label = $(scoper).children("div:last").prev();
						label.replaceWith('<h3><a href="#">' + label.html() + '</a></h3>');
					}
				});
			}
		}, $.isFunction($.fn.accordion));

	$.dform.subscribe("entries",
		/**
		 *  Create entries for the accordion type.
		 *  Use the <elements> subscriber to create subelements in each entry.
		 *
		 * @param options All options for the container div. The <caption> will be
		 * 	turned into the accordion or tab title.
		 * @param type The type. This subscriber will only run for accordion
		 */
		function(options, type) {
			if(type == "tabs")
			{
				var scoper = this;
				this.append("<ul>");
				var ul = $(scoper).children("ul:first");
				$.each(options, function(index, options) {
					var id = options.id ? options.id : index;
					$.extend(options, { "type" : "container", "id" : id });
					$(scoper).dform('append', options);
					var label = $(scoper).children("div:last").prev();
					$(label).wrapInner($("<a>").attr("href", "#" + id));
					$(ul).append($("<li>").wrapInner(label));
				});
			}
		}, $.isFunction($.fn.tabs));
		
	$.dform.subscribe("dialog",
		/**
		 * Turns an element into a jQuery UI dialog.
		 *
		 * @param options As specified in the [jQuery UI dialog documentation\(http://jqueryui.com/demos/dialog/)
		 */
		function(options)
		{
			this.dialog(options);
		}, $.isFunction($.fn.dialog));

	$.dform.subscribe("resizable",
		/**
		 * Make the current element resizable.
		 *
		 * @param options As specified in the [jQuery UI resizable documentation](http://jqueryui.com/demos/resizable/)
		 */
		function(options)
		{
			this.resizable(options);
		}, $.isFunction($.fn.resizable));

	$.dform.subscribe("datepicker",
		/**
		 * Adds a jQuery UI datepicker to an element of type text.
		 *
		 * @param options As specified in the [jQuery UI datepicker documentation](http://jqueryui.com/demos/datepicker/)
		 * @param type The type of the element
		 */
		function(options, type)
		{
			if (type == "text") {
				this.datepicker(options);
			}
		}, $.isFunction($.fn.datepicker));

	$.dform.subscribe("autocomplete",
		/**
		 * Adds the autocomplete feature to a text element.
		 *
		 * @param options As specified in the [jQuery UI autotomplete documentation](http://jqueryui.com/demos/autotomplete/)
		 * @param type The type of the element
		 */
		function(options, type)
		{
			if (type == "text") {
				this.autocomplete(options);
			}
		}, $.isFunction($.fn.autocomplete));

	$.dform.subscribe("[post]",
		/**
		 * Post processing subscriber that adds jQuery UI styling classes to
		 * text, textarea, password and fieldset elements as well
		 * as calling .button() on submit or button elements.
		 *
		 * Additionally, accordion and tabs elements will be initialized
		 * with their options.
		 *
		 * @param options All options that have been passed for creating the element
		 * @param type The type of the element
		 */
		function(options, type)
		{
			if (this.parents("form").hasClass("ui-widget"))
			{
				if ((type === "button" || type === "submit") && $.isFunction($.fn.button)) {
					this.button();
				}
				if (!!~$.inArray(type, [ "text", "textarea", "password",
						"fieldset" ])) {
					this.addClass("ui-widget-content ui-corner-all");
				}
			}
			if(type === "accordion" || type === "tabs") {
				this[type](_getOptions(type, options));
			}
		});
	
	$.dform.subscribe("[pre]",
		/**
		 * Add a preprocessing subscriber that calls .validate() on the form,
		 * so that we can add rules to the input elements. Additionally
		 * the jQuery UI highlight classes will be added to the validation
		 * plugin default settings if the form has the ui-widget class.
		 * 
		 * @param options All options that have been used for
		 * creating the current element.
		 * @param type The type of the *this* element
		 */
		function(options, type)
		{
			if(type == "form")
			{
				var defaults = {};
				if(this.hasClass("ui-widget"))
				{
					defaults = {
						highlight: function(input)
						{
							$(input).addClass("ui-state-highlight");
						},
						unhighlight: function(input)
						{
							$(input).removeClass("ui-state-highlight");
						}
					};
				}
				if (typeof (options.validate) == 'object') {
					$.extend(defaults, options.validate);
				}
				this.validate(defaults);
			}
		}, $.isFunction($.fn.validate));

		/**
		 * Adds support for the jQuery validation rulesets.
		 * For types: text, password, textarea, radio, checkbox sets up rules through rules("add", rules) for validation plugin
		 * For type <form> sets up as options object for validate method of validation plugin
		 * For rules of types checkboxes and radiobuttons you should use this subscriber for type form (to see example below)
		 *
		 * @param options
		 * @param type
		 */
	$.dform.subscribe("validate", function(options, type)
		{
			if (type != "form") {
				this.rules("add", options);
			}
		}, $.isFunction($.fn.validate));

	$.dform.subscribe("ajax",
		/**
		 * If the current element is a form, it will be turned into a dynamic form
		 * that can be submitted asynchronously.
		 *
		 * @param options Options as specified in the [jQuery Form plugin documentation](http://jquery.malsup.com/form/#options-object)
		 * @param type The type of the element
		 */
		function(options, type)
		{
			if(type === "form")
			{
				this.ajaxForm(options);
			}
		}, $.isFunction($.fn.ajaxForm));

	$.dform.subscribe('html',
		/**
		 * Extends the html subscriber that will replace any string with it's translated
		 * equivalent using the jQuery Global plugin. The html content will be interpreted
		 * as an index string where the first part indicates the localize main index and
		 * every following a sub index using getValueAt.
		 *
		 * @param options The dot separated html string to localize
		 * @param type The type of the this element
		 */
		function(options, type)
		{
			if(typeof options === 'string') {
				var keys = options.split('.'),
					translated = Globalize.localize(keys.shift());
				if(translated = _get(keys, translated)) {
					$(this).html(translated);
				}
			}
		}, typeof Globalize !== 'undefined' && $.isFunction(Globalize.localize));

	$.dform.subscribe('options',
		/**
		 * Extends the options subscriber for using internationalized option
		 * lists.
		 *
		 * @param options Options as specified in the <jQuery Form plugin documentation at http://jquery.malsup.com/form/#options-object>
		 * @param type The type of the element.
		 */
		function(options, type)
		{
			if(type === 'select' && typeof(options) === 'string') {
				$(this).html('');
				var keys = options.split('.'),
					optlist = Globalize.localize(keys.shift());
				if(optlist = _get(keys, optlist)) {
					$(this).dform('run', 'options', optlist, type);
				}
			}
		}, typeof Globalize !== 'undefined' && $.isFunction(Globalize.localize));
})(jQuery);


================================================
FILE: src/dform.js
================================================
/*
 * jQuery dform plugin
 * Copyright (C) 2012 David Luecke <daff@neyeon.com>, [http://daffl.github.com/jquery.dform]
 * 
 * Licensed under the MIT license
 */
(function ($) {
	var _subscriptions = {},
		_types = {},
		each = $.each,
		addToObject = function (obj) {
			var result = function (data, fn, condition) {
				if (typeof data === 'object') {
					$.each(data, function (name, val) {
						result(name, val, condition);
					});
				} else if (condition === undefined || condition === true) {
					if (!obj[data]) {
						obj[data] = [];
					}
					obj[data].push(fn);
				}
			}
			return result;
		},
		isArray = $.isArray,
		/**
		 * Returns an array of keys (properties) contained in the given object.
		 *
		 * @param {Object} object The object to use
		 * @return {Array} An array containing all properties in the object
		 */
		keyset = function (object) {
			return $.map(object, function (val, key) {
				return key;
			});
		},
		/**
		 * Returns an object that contains all values from the given
		 * object that have a key which is also in the array keys.
		 *
		 * @param {Object} object The object to traverse
		 * @param {Array} keys The keys the new object should contain
		 * @return {Object} A new object containing only the properties
		 * with names given in keys
		 */
		withKeys = function (object, keys) {
			var result = {};
			each(keys, function (index, value) {
				if (object[value]) {
					result[value] = object[value];
				}
			});
			return result;
		},
		/**
		 * Returns an object that contains all value from the given
		 * object that do not have a key which is also in the array keys.
		 *
		 * @param {Object} object The object to traverse
		 * @param {Array} keys A list of keys that should not be contained in the new object
		 * @return {Object} A new object with all properties of the given object, except
		 * for the ones given in the list of keys
		 */
		withoutKeys = function (object, keys) {
			var result = {};
			each(object, function (index, value) {
				if (!~$.inArray(index, keys)) {
					result[index] = value;
				}
			});
			return result;
		},
		/**
		 * Run all subscriptions with the given name and options
		 * on an element.
		 *
		 * @param {String} name The name of the subscriber function
		 * @param {Object} options ptions for the function
		 * @param {String} type The type of the current element as in the registered types
		 * @return {Object} The jQuery object
		 */
		runSubscription = function (name, options, type) {
			if ($.dform.hasSubscription(name)) {
				this.each(function () {
					var element = $(this);
					each(_subscriptions[name], function (i, sfn) {
						// run subscriber function with options
						sfn.call(element, options, type);
					});
				});
			}
			return this;
		},
		/**
		 * Run all subscription functions with given options.
		 *
		 * @param {Object} options The options to use
		 * @return {Object} The jQuery element this function has been called on
		 */
		runAll = function (options) {
			var type = options.type, self = this;
			// Run preprocessing subscribers
			this.dform('run', '[pre]', options, type);
			each(options, function (name, sopts) {
				self.dform('run', name, sopts, type);
			});
			// Run post processing subscribers
			this.dform('run', '[post]', options, type);
			return this;
		};

	/**
	 * Globals added directly to the jQuery object
	 */
	$.extend($, {
		keyset : keyset,
		withKeys : withKeys,
		withoutKeys : withoutKeys,
		dform : {
			/**
			 * Default options the plugin is initialized with:
			 *
			 * ## prefix
			 *
			 * The Default prefix used for element classnames generated by the dform plugin.
			 * Defaults to _ui-dform-_
			 * E.g. an element with type text will have the class ui-dform-text
			 *
			 */
			options : {
				prefix : "ui-dform-"
			},

			/**
			 * A function that is called, when no registered type has been found.
			 * The default behaviour returns an HTML element with the tag
			 * as specified in type and the HTML attributes given in options
			 * (without subscriber options).
			 *
			 * @param {Object} options
			 * @return {Object} The created object
			 */
			defaultType : function (options) {
				return $("<" + options.type + ">").dform('attr', options);
			},
			/**
			 * Return all types.
			 *
			 * @params {String} name (optional) If passed return
			 * all type generators for a given name.
			 * @return {Object} Mapping from type name to
			 * an array of generator functions.
			 */
			types : function (name) {
				return name ? _types[name ] : _types;
			},
			/**
			 * Register an element type function.
			 *
			 * @param {String|Array} data Can either be the name of the type
			 * function or an object that contains name : type function pairs
			 * @param {Function} fn The function that creates a new type element
			 */
			addType : addToObject(_types),
			/**
			 * Returns all subscribers or all subscribers for a given name.
			 *
			 * @params {String} name (optional) If passed return all
			 * subscribers for a given name
			 * @return {Object} Mapping from subscriber names
			 * to an array of subscriber functions.
			 */
			subscribers : function (name) {
				return name ? _subscriptions[name] : _subscriptions;
			},
			/**
			 * Register a subscriber function.
			 *
			 * @param {String|Object} data Can either be the name of the subscriber
			 * function or an object that contains name : subscriber function pairs
			 * @param {Function} fn The function to subscribe or nothing if an object is passed for data
			 * @param {Array} deps An optional list of dependencies
			 */
			subscribe : addToObject(_subscriptions),
			/**
			 * Returns if a subscriber function with the given name
			 * has been registered.
			 *
			 * @param {String} name The subscriber name
			 * @return {Boolean} True if the given name has at least one subscriber registered,
			 *     false otherwise
			 */
			hasSubscription : function (name) {
				return _subscriptions[name] ? true : false;
			},
			/**
			 * Create a new element.
			 *
			 * @param {Object} options - The options to use
			 * @return {Object} The element as created by the builder function specified
			 *     or returned by the defaultType function.
			 */
			createElement : function (options) {
				if (!options.type) {
					throw "No element type given! Must always exist.";
				}
				var type = options.type,
					element = null,
				// We don't need the type key in the options
					opts = $.withoutKeys(options, ["type"]);

				if (_types[type]) {
					// Run all type element builder functions called typename
					each(_types[type], function (i, sfn) {
						element = sfn.call(element, opts);
					});
				} else {
					// Call defaultType function if no type was found
					element = $.dform.defaultType(options);
				}
				return $(element);
			},
			methods : {
				/**
				 * Run all subscriptions with the given name and options
				 * on an element.
				 *
				 * @param {String} name The name of the subscriber function
				 * @param {Object} options ptions for the function
				 * @param {String} type The type of the current element as in the registered types
				 * @return {Object} The jQuery object
				 */
				run : function (name, options, type) {
					if (typeof name !== 'string') {
						return runAll.call(this, name);
					}
					return runSubscription.call(this, name, options, type);
				},
				/**
				 * Creates a form element on an element with given options
				 *
				 * @param {Object} options The options to use
				 * @return {Object} The jQuery element this function has been called on
				 */
				append : function (options, converter) {
					if (converter && $.dform.converters && $.isFunction($.dform.converters[converter])) {
						options = $.dform.converters[converter](options);
					}
					// Create element (run builder function for type)
					var element = $.dform.createElement(options);
					this.append(element);
					// Run all subscriptions
					element.dform('run', options);
				},
				/**
				 * Adds HTML attributes to the current element from the given options.
				 * Any subscriber will be omitted so that the attributes will contain any
				 * key value pair where the key is not the name of a subscriber function
				 * and is not in the string array excludes.
				 *
				 * @param {Object} object The attribute object
				 * @param {Array} excludes A list of keys that should also be excluded
				 * @return {Object} The jQuery object of the this reference
				 */
				attr : function (object, excludes) {
					// Ignore any subscriber name and the objects given in excludes
					var ignores = $.keyset(_subscriptions);
					isArray(excludes) && $.merge(ignores, excludes);
					this.attr($.withoutKeys(object, ignores));
				},
				/**
				 *
				 *
				 * @param params
				 * @param success
				 * @param error
				 */
				ajax : function (params, success, error) {
					var options = {
						error : error,
						url : params
					}, self = this;
					if (typeof params !== 'string') {
						$.extend(options, params);
					}
					options.success = function (data) {
						var callback = success || params.success;
						self.dform(data);
						if(callback) {
							callback.call(self, data);
						}
					}
					$.ajax(options);
				},
				/**
				 *
				 *
				 * @param options
				 */
				init : function (options, converter) {
					var opts = options.type ? options : $.extend({ "type" : "form" }, options);
					if (converter && $.dform.converters && $.isFunction($.dform.converters[converter])) {
						opts = $.dform.converters[converter](opts);
					}
					if (this.is(opts.type)) {
						this.dform('attr', opts);
						this.dform('run', opts);
					} else {
						this.dform('append', opts);
					}
				}
			}
		}
	});

	/**
	 * The jQuery plugin function
	 *
	 * @param options The form options
	 * @param {String} converter The name of the converter in $.dform.converters
	 * that will be used to convert the options
	 */
	$.fn.dform = function (options, converter, error) {
		var self = $(this);
		if ($.dform.methods[options]) {
			$.dform.methods[options].apply(self, Array.prototype.slice.call(arguments, 1));
		} else {
			if (typeof options === 'string') {
				$.dform.methods.ajax.call(self, {
					url : options,
					dataType : 'json'
				}, converter, error);
			} else {
				$.dform.methods.init.apply(self, arguments);
			}
		}
		return this;
	}
})(jQuery);


================================================
FILE: start.html
================================================
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>Get started with jQuery dForm</title>
</head>
<style type="text/css">
    input, label {
        display: block;
        margin-bottom: 5px;
    }
</style>
<body>
<form id="demo-1-form"></form>
<pre data-for="demo-1"></pre>

<form id="demo-2-form"></form>
<pre data-for="demo-2"></pre>

<!-- Load jQuery and the minified plugin -->
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript" src="dist/jquery.dform-1.1.0.min.js"></script>

<script type="text/javascript">
    $(function () {
        $('script.demo').each(function () {
            $('pre[data-for="' + $(this).attr('id') + '"]').html($(this).html());
        });
    });
</script>
<script type="text/javascript" class="demo" id="demo-1">
$(function () {
    // Create a form from some JSON
    $("#demo-1-form").dform({
        "action":"index.html",
        "method":"get",
        "html":[
            {
                "type":"p",
                "html":"You must login"
            },
            {
                "name":"username",
                "id":"txt-username",
                "caption":"Username",
                "type":"text",
                "placeholder":"E.g. u...@example.com"
            },
            {
                "name":"password",
                "caption":"Password",
                "type":"password"
            },
            {
                "type":"submit",
                "value":"Login"
            }
        ]
    });
});
</script>
<script type="text/javascript" class="demo" id="demo-2">
$('#demo-2-form').dform({
    "action":"index.html",
    "method":"post",
    "html":[
        {
            "type":"fieldset",
            "caption":"User information",
            "html":[
                {
                    "name":"email",
                    "caption":"Email address",
                    "type":"text",
                    "placeholder":"E.g. user@example.com",
                    "validate":{
                        "email":true
                    }
                },
                {
                    "name":"password",
                    "caption":"Password",
                    "type":"password",
                    "id":"registration-password",
                    "validate":{
                        "required":true,
                        "minlength":5,
                        "messages":{
                            "required":"Please enter a password",
                            "minlength":"At least {0} characters long"
                        }
                    }
                },
                {
                    "name":"password-repeat",
                    "caption":"Repeat password",
                    "type":"password",
                    "validate":{
                        "equalTo":"#registration-password",
                        "messages":{
                            "equalTo":"Please repeat your password"
                        }
                    }
                },
                {
                    "type":"radiobuttons",
                    "caption":"Sex",
                    "name":"sex",
                    "class":"labellist",
                    "options":{
                        "f":"Female",
                        "m":"Male"
                    }
                },
                {
                    "type":"checkboxes",
                    "name":"test",
                    "caption":"Receive newsletter about",
                    "class":"labellist",
                    "options":{
                        "updates":"Product updates",
                        "errors":{
                            "value":"security",
                            "caption":"Security warnings",
                            "checked":"checked"
                        }
                    }
                }
            ]
        },
        {
            "type":"fieldset",
            "caption":"Address information",
            "html":[
                {
                    "name":"name",
                    "caption":"Your name",
                    "type":"text",
                    "placeholder":"E.g. John Doe"
                },
                {
                    "name":"address",
                    "caption":"Address",
                    "type":"text",
                    "validate":{ "required":true }
                },
                {
                    "name":"zip",
                    "caption":"ZIP code",
                    "type":"text",
                    "size":5,
                    "validate":{ "required":true }
                },
                {
                    "name":"city",
                    "caption":"City",
                    "type":"text",
                    "validate":{ "required":true }
                },
                {
                    "type":"select",
                    "name":"continent",
                    "caption":"Choose a continent",
                    "options":{
                        "america":"America",
                        "europe":{
                            "selected":"true",
                            "id":"europe-option",
                            "value":"europe",
                            "html":"Europe"
                        },
                        "asia":"Asia",
                        "africa":"Africa",
                        "australia":"Australia"
                    }
                }
            ]
        },
        {
            "type":"submit",
            "value":"Signup"
        }
    ]
});
</script>
</body>
</html>


================================================
FILE: test/index.html
================================================
<!DOCTYPE html>
<html>
<head>
	<script src="http://code.jquery.com/jquery-latest.js"></script>
	<link rel="stylesheet" href="http://code.jquery.com/qunit/qunit-1.12.0.css" type="text/css" media="screen" />
  <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.0/themes/base/jquery-ui.css" type="text/css" media="screen" />

  <script type="text/javascript" src="libs/globalize.js"></script>
  <script type="text/javascript" src="http://code.jquery.com/ui/1.10.0/jquery-ui.js"></script>

	<script type="text/javascript" src="http://code.jquery.com/qunit/qunit-1.12.0.js"></script>
	<script type="text/javascript" src="../src/dform.js"></script>
	<script type="text/javascript" src="../src/dform.core.js"></script>
	<script type="text/javascript" src="../src/dform.converters.js"></script>
	<script type="text/javascript" src="../src/dform.extensions.js"></script>

	<script type="text/javascript" src="test.js"></script>
	<script type="text/javascript" src="test_types.js"></script>
	<script type="text/javascript" src="test_subscribers.js"></script>
	<script type="text/javascript" src="test_extensions.js"></script>
  <script type="text/javascript" src="test_jqueryui.js"></script>

	<title>jQuery dForm - QUnit tests</title>
</head>
<body>
	<h1 id="qunit-header">QUnit example</h1>
	<h2 id="qunit-banner"></h2>
	<div id="qunit-testrunner-toolbar"></div>
	<h2 id="qunit-userAgent"></h2>
	<ol id="qunit-tests"></ol>
	<div id="qunit-fixture">test markup, will be hidden</div>
  <div id="qunit-testarea"></div>
</body>
</html>


================================================
FILE: test/libs/cultures/globalize.culture.af-ZA.js
================================================
/*
 * Globalize Culture af-ZA
 *
 * http://github.com/jquery/globalize
 *
 * Copyright Software Freedom Conservancy, Inc.
 * Dual licensed under the MIT or GPL Version 2 licenses.
 * http://jquery.org/license
 *
 * This file was generated by the Globalize Culture Generator
 * Translation: bugs found in this file need to be fixed in the generator
 */

(function( window, undefined ) {

var Globalize;

if ( typeof require !== "undefined" &&
	typeof exports !== "undefined" &&
	typeof module !== "undefined" ) {
	// Assume CommonJS
	Globalize = require( "globalize" );
} else {
	// Global variable
	Globalize = window.Globalize;
}

Globalize.addCultureInfo( "af-ZA", "default", {
	name: "af-ZA",
	englishName: "Afrikaans (South Africa)",
	nativeName: "Afrikaans (Suid Afrika)",
	language: "af",
	numberFormat: {
		percent: {
			pattern: ["-n%","n%"]
		},
		currency: {
			pattern: ["$-n","$ n"],
			symbol: "R"
		}
	},
	calendars: {
		standard: {
			days: {
				names: ["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],
				namesAbbr: ["Son","Maan","Dins","Woen","Dond","Vry","Sat"],
				namesShort: ["So","Ma","Di","Wo","Do","Vr","Sa"]
			},
			months: {
				names: ["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember",""],
				namesAbbr: ["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des",""]
			},
			patterns: {
				d: "yyyy/MM/dd",
				D: "dd MMMM yyyy",
				t: "hh:mm tt",
				T: "hh:mm:ss tt",
				f: "dd MMMM yyyy hh:mm tt",
				F: "dd MMMM yyyy hh:mm:ss tt",
				M: "dd MMMM",
				Y: "MMMM yyyy"
			}
		}
	}
});

}( this ));


================================================
FILE: test/libs/cultures/globalize.culture.af.js
================================================
/*
 * Globalize Culture af
 *
 * http://github.com/jquery/globalize
 *
 * Copyright Software Freedom Conservancy, Inc.
 * Dual licensed under the MIT or GPL Version 2 licenses.
 * http://jquery.org/license
 *
 * This file was generated by the Globalize Culture Generator
 * Translation: bugs found in this file need to be fixed in the generator
 */

(function( window, undefined ) {

var Globalize;

if ( typeof require !== "undefined" &&
	typeof exports !== "undefined" &&
	typeof module !== "undefined" ) {
	// Assume CommonJS
	Globalize = require( "globalize" );
} else {
	// Global variable
	Globalize = window.Globalize;
}

Globalize.addCultureInfo( "af", "default", {
	name: "af",
	englishName: "Afrikaans",
	nativeName: "Afrikaans",
	language: "af",
	numberFormat: {
		percent: {
			pattern: ["-n%","n%"]
		},
		currency: {
			pattern: ["$-n","$ n"],
			symbol: "R"
		}
	},
	calendars: {
		standard: {
			days: {
				names: ["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],
				namesAbbr: ["Son","Maan","Dins","Woen","Dond","Vry","Sat"],
				namesShort: ["So","Ma","Di","Wo","Do","Vr","Sa"]
			},
			months: {
				names: ["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember",""],
				namesAbbr: ["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des",""]
			},
			patterns: {
				d: "yyyy/MM/dd",
				D: "dd MMMM yyyy",
				t: "hh:mm tt",
				T: "hh:mm:ss tt",
				f: "dd MMMM yyyy hh:mm tt",
				F: "dd MMMM yyyy hh:mm:ss tt",
				M: "dd MMMM",
				Y: "MMMM yyyy"
			}
		}
	}
});

}( this ));


================================================
FILE: test/libs/cultures/globalize.culture.am-ET.js
================================================
/*
 * Globalize Culture am-ET
 *
 * http://github.com/jquery/globalize
 *
 * Copyright Software Freedom Conservancy, Inc.
 * Dual licensed under the MIT or GPL Version 2 licenses.
 * http://jquery.org/license
 *
 * This file was generated by the Globalize Culture Generator
 * Translation: bugs found in this file need to be fixed in the generator
 */

(function( window, undefined ) {

var Globalize;

if ( typeof require !== "undefined" &&
	typeof exports !== "undefined" &&
	typeof module !== "undefined" ) {
	// Assume CommonJS
	Globalize = require( "globalize" );
} else {
	// Global variable
	Globalize = window.Globalize;
}

Globalize.addCultureInfo( "am-ET", "default", {
	name: "am-ET",
	englishName: "Amharic (Ethiopia)",
	nativeName: "አማርኛ (ኢትዮጵያ)",
	language: "am",
	numberFormat: {
		decimals: 1,
		groupSizes: [3,0],
		"NaN": "NAN",
		percent: {
			pattern: ["-n%","n%"],
			decimals: 1,
			groupSizes: [3,0]
		},
		currency: {
			pattern: ["-$n","$n"],
			groupSizes: [3,0],
			symbol: "ETB"
		}
	},
	calendars: {
		standard: {
			days: {
				names: ["እሑድ","ሰኞ","ማክሰኞ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],
				namesAbbr: ["እሑድ","ሰኞ","ማክሰ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],
				namesShort: ["እ","ሰ","ማ","ረ","ሐ","ዓ","ቅ"]
			},
			months: {
				names: ["ጃንዩወሪ","ፌብሩወሪ","ማርች","ኤፕረል","ሜይ","ጁን","ጁላይ","ኦገስት","ሴፕቴምበር","ኦክተውበር","ኖቬምበር","ዲሴምበር",""],
				namesAbbr: ["ጃንዩ","ፌብሩ","ማርች","ኤፕረ","ሜይ","ጁን","ጁላይ","ኦገስ","ሴፕቴ","ኦክተ","ኖቬም","ዲሴም",""]
			},
			AM: ["ጡዋት","ጡዋት","ጡዋት"],
			PM: ["ከሰዓት","ከሰዓት","ከሰዓት"],
			eras: [{"name":"ዓመተ  ምሕረት","start":null,"offset":0}],
			patterns: {
				d: "d/M/yyyy",
				D: "dddd '፣' MMMM d 'ቀን' yyyy",
				f: "dddd '፣' MMMM d 'ቀን' yyyy h:mm tt",
				F: "dddd '፣' MMMM d 'ቀን' yyyy h:mm:ss tt",
				M: "MMMM d ቀን",
				Y: "MMMM yyyy"
			}
		}
	}
});

}( this ));


================================================
FILE: test/libs/cultures/globalize.culture.am.js
================================================
/*
 * Globalize Culture am
 *
 * http://github.com/jquery/globalize
 *
 * Copyright Software Freedom Conservancy, Inc.
 * Dual licensed under the MIT or GPL Version 2 licenses.
 * http://jquery.org/license
 *
 * This file was generated by the Globalize Culture Generator
 * Translation: bugs found in this file need to be fixed in the generator
 */

(function( window, undefined ) {

var Globalize;

if ( typeof require !== "undefined" &&
	typeof exports !== "undefined" &&
	typeof module !== "undefined" ) {
	// Assume CommonJS
	Globalize = require( "globalize" );
} else {
	// Global variable
	Globalize = window.Globalize;
}

Globalize.addCultureInfo( "am", "default", {
	name: "am",
	englishName: "Amharic",
	nativeName: "አማርኛ",
	language: "am",
	numberFormat: {
		decimals: 1,
		groupSizes: [3,0],
		"NaN": "NAN",
		percent: {
			pattern: ["-n%","n%"],
			decimals: 1,
			groupSizes: [3,0]
		},
		currency: {
			pattern: ["-$n","$n"],
			groupSizes: [3,0],
			symbol: "ETB"
		}
	},
	calendars: {
		standard: {
			days: {
				names: ["እሑድ","ሰኞ","ማክሰኞ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],
				namesAbbr: ["እሑድ","ሰኞ","ማክሰ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],
				namesShort: ["እ","ሰ","ማ","ረ","ሐ","ዓ","ቅ"]
			},
			months: {
				names: ["ጃንዩወሪ","ፌብሩወሪ","ማርች","ኤፕረል","ሜይ","ጁን","ጁላይ","ኦገስት","ሴፕቴምበር","ኦክተውበር","ኖቬምበር","ዲሴምበር",""],
				namesAbbr: ["ጃንዩ","ፌብሩ","ማርች","ኤፕረ","ሜይ","ጁን","ጁላይ","ኦገስ","ሴፕቴ","ኦክተ","ኖቬም","ዲሴም",""]
			},
			AM: ["ጡዋት","ጡዋት","ጡዋት"],
			PM: ["ከሰዓት","ከሰዓት","ከሰዓት"],
			eras: [{"name":"ዓመተ  ምሕረት","start":null,"offset":0}],
			patterns: {
				d: "d/M/yyyy",
				D: "dddd '፣' MMMM d 'ቀን' yyyy",
				f: "dddd '፣' MMMM d 'ቀን' yyyy h:mm tt",
				F: "dddd '፣' MMMM d 'ቀን' yyyy h:mm:ss tt",
				M: "MMMM d ቀን",
				Y: "MMMM yyyy"
			}
		}
	}
});

}( this ));


================================================
FILE: test/libs/cultures/globalize.culture.ar-AE.js
================================================
/*
 * Globalize Culture ar-AE
 *
 * http://github.com/jquery/globalize
 *
 * Copyright Software Freedom Conservancy, Inc.
 * Dual licensed under the MIT or GPL Version 2 licenses.
 * http://jquery.org/license
 *
 * This file was generated by the Globalize Culture Generator
 * Translation: bugs found in this file need to be fixed in the generator
 */

(function( window, undefined ) {

var Globalize;

if ( typeof require !== "undefined" &&
	typeof exports !== "undefined" &&
	typeof module !== "undefined" ) {
	// Assume CommonJS
	Globalize = require( "globalize" );
} else {
	// Global variable
	Globalize = window.Globalize;
}

Globalize.addCultureInfo( "ar-AE", "default", {
	name: "ar-AE",
	englishName: "Arabic (U.A.E.)",
	nativeName: "العربية (الإمارات العربية المتحدة)",
	language: "ar",
	isRTL: true,
	numberFormat: {
		pattern: ["n-"],
		"NaN": "ليس برقم",
		negativeInfinity: "-لا نهاية",
		positiveInfinity: "+لا نهاية",
		currency: {
			pattern: ["$n-","$ n"],
			symbol: "د.إ.\u200f"
		}
	},
	calendars: {
		standard: {
			firstDay: 6,
			days: {
				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
			},
			months: {
				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
			},
			AM: ["ص","ص","ص"],
			PM: ["م","م","م"],
			patterns: {
				d: "dd/MM/yyyy",
				D: "dd MMMM, yyyy",
				t: "hh:mm tt",
				T: "hh:mm:ss tt",
				f: "dd MMMM, yyyy hh:mm tt",
				F: "dd MMMM, yyyy hh:mm:ss tt",
				M: "dd MMMM"
			}
		},
		UmAlQura: {
			name: "UmAlQura",
			firstDay: 6,
			days: {
				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
			},
			months: {
				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
			},
			AM: ["ص","ص","ص"],
			PM: ["م","م","م"],
			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
			twoDigitYearMax: 1451,
			patterns: {
				d: "dd/MM/yy",
				D: "dd/MMMM/yyyy",
				t: "hh:mm tt",
				T: "hh:mm:ss tt",
				f: "dd/MMMM/yyyy hh:mm tt",
				F: "dd/MMMM/yyyy hh:mm:ss tt",
				M: "dd MMMM"
			},
			convert: {
                    _yearInfo: [
                        // MonthLengthFlags, Gregorian Date
                        [746, -2198707200000],
                        [1769, -2168121600000],
                        [3794, -2137449600000],
                        [3748, -2106777600000],
                        [3402, -2076192000000],
                        [2710, -2045606400000],
                        [1334, -2015020800000],
                        [2741, -1984435200000],
                        [3498, -1953763200000],
                        [2980, -1923091200000],
                        [2889, -1892505600000],
                        [2707, -1861920000000],
                        [1323, -1831334400000],
                        [2647, -1800748800000],
                        [1206, -1770076800000],
                        [2741, -1739491200000],
                        [1450, -1708819200000],
                        [3413, -1678233600000],
                        [3370, -1647561600000],
                        [2646, -1616976000000],
                        [1198, -1586390400000],
                        [2397, -1555804800000],
                        [748, -1525132800000],
                        [1749, -1494547200000],
                        [1706, -1463875200000],
                        [1365, -1433289600000],
                        [1195, -1402704000000],
                        [2395, -1372118400000],
                        [698, -1341446400000],
                        [1397, -1310860800000],
                        [2994, -1280188800000],
                        [1892, -1249516800000],
                        [1865, -1218931200000],
                        [1621, -1188345600000],
                        [683, -1157760000000],
                        [1371, -1127174400000],
                        [2778, -1096502400000],
                        [1748, -1065830400000],
                        [3785, -1035244800000],
                        [3474, -1004572800000],
                        [3365, -973987200000],
                        [2637, -943401600000],
                        [685, -912816000000],
                        [1389, -882230400000],
                        [2922, -851558400000],
                        [2898, -820886400000],
                        [2725, -790300800000],
                        [2635, -759715200000],
                        [1175, -729129600000],
                        [2359, -698544000000],
                        [694, -667872000000],
                        [1397, -637286400000],
                        [3434, -606614400000],
                        [3410, -575942400000],
                        [2710, -545356800000],
                        [2349, -514771200000],
                        [605, -484185600000],
                        [1245, -453600000000],
                        [2778, -422928000000],
                        [1492, -392256000000],
                        [3497, -361670400000],
                        [3410, -330998400000],
                        [2730, -300412800000],
                        [1238, -269827200000],
                        [2486, -239241600000],
                        [884, -208569600000],
                        [1897, -177984000000],
                        [1874, -147312000000],
                        [1701, -116726400000],
                        [1355, -86140800000],
                        [2731, -55555200000],
                        [1370, -24883200000],
                        [2773, 5702400000],
                        [3538, 36374400000],
                        [3492, 67046400000],
                        [3401, 97632000000],
                        [2709, 128217600000],
                        [1325, 158803200000],
                        [2653, 189388800000],
                        [1370, 220060800000],
                        [2773, 250646400000],
                        [1706, 281318400000],
                        [1685, 311904000000],
                        [1323, 342489600000],
                        [2647, 373075200000],
                        [1198, 403747200000],
                        [2422, 434332800000],
                        [1388, 465004800000],
                        [2901, 495590400000],
                        [2730, 526262400000],
                        [2645, 556848000000],
                        [1197, 587433600000],
                        [2397, 618019200000],
                        [730, 648691200000],
                        [1497, 679276800000],
                        [3506, 709948800000],
                        [2980, 740620800000],
                        [2890, 771206400000],
                        [2645, 801792000000],
                        [693, 832377600000],
                        [1397, 862963200000],
                        [2922, 893635200000],
                        [3026, 924307200000],
                        [3012, 954979200000],
                        [2953, 985564800000],
                        [2709, 1016150400000],
                        [1325, 1046736000000],
                        [1453, 1077321600000],
                        [2922, 1107993600000],
                        [1748, 1138665600000],
                        [3529, 1169251200000],
                        [3474, 1199923200000],
                        [2726, 1230508800000],
                        [2390, 1261094400000],
                        [686, 1291680000000],
                        [1389, 1322265600000],
                        [874, 1352937600000],
                        [2901, 1383523200000],
                        [2730, 1414195200000],
                        [2381, 1444780800000],
                        [1181, 1475366400000],
                        [2397, 1505952000000],
                        [698, 1536624000000],
                        [1461, 1567209600000],
                        [1450, 1597881600000],
                        [3413, 1628467200000],
                        [2714, 1659139200000],
                        [2350, 1689724800000],
                        [622, 1720310400000],
                        [1373, 1750896000000],
                        [2778, 1781568000000],
                        [1748, 1812240000000],
                        [1701, 1842825600000],
                        [0, 1873411200000]
                    ],
                    minDate: -2198707200000,
                    maxDate: 1873411199999,
                    toGregorian: function(hyear, hmonth, hday) {
                        var days = hday - 1,
                            gyear = hyear - 1318;
                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
                        var info = this._yearInfo[gyear],
                            gdate = new Date(info[1]),
                            monthLength = info[0];
                        // Date's ticks in javascript are always from the GMT time,
                        // but we are interested in the gregorian date in the same timezone,
                        // not what the gregorian date was at GMT time, so we adjust for the offset.
                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
                        for (var i = 0; i < hmonth; i++) {
                            days += 29 + (monthLength & 1);
                            monthLength = monthLength >> 1;
                        }
                        gdate.setDate(gdate.getDate() + days);
                        return gdate;
                    },
                    fromGregorian: function(gdate) {
                        // Date's ticks in javascript are always from the GMT time,
                        // but we are interested in the hijri date in the same timezone,
                        // not what the hijri date was at GMT time, so we adjust for the offset.
                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
                        if (ticks < this.minDate || ticks > this.maxDate) return null;
                        var hyear = 0,
                            hmonth = 1;
                        // find the earliest gregorian date in the array that is greater than or equal to the given date
                        while (ticks > this._yearInfo[++hyear][1]) { }
                        if (ticks !== this._yearInfo[hyear][1]) {
                            hyear--;
                        }
                        var info = this._yearInfo[hyear],
                            // how many days has it been since the date we found in the array?
                            // 86400000 = ticks per day
                            days = Math.floor((ticks - info[1]) / 86400000),
                            monthLength = info[0];
                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
                        // now increment day/month based on the total days, considering
                        // how many days are in each month. We cannot run past the year
                        // mark since we would have found a different array entry in that case.
                        var daysInMonth = 29 + (monthLength & 1);
                        while (days >= daysInMonth) {
                            days -= daysInMonth;
                            monthLength = monthLength >> 1;
                            daysInMonth = 29 + (monthLength & 1);
                            hmonth++;
                        }
                        // remaining days is less than is in one month, thus is the day of the month we landed on
                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
                        return [hyear, hmonth - 1, days + 1];
                    }
			}
		},
		Hijri: {
			name: "Hijri",
			firstDay: 6,
			days: {
				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
			},
			months: {
				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
			},
			AM: ["ص","ص","ص"],
			PM: ["م","م","م"],
			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
			twoDigitYearMax: 1451,
			patterns: {
				d: "dd/MM/yy",
				D: "dd/MM/yyyy",
				t: "hh:mm tt",
				T: "hh:mm:ss tt",
				f: "dd/MM/yyyy hh:mm tt",
				F: "dd/MM/yyyy hh:mm:ss tt",
				M: "dd MMMM"
			},
			convert: {
                    // Adapted to Script from System.Globalization.HijriCalendar
                    ticks1970: 62135596800000,
                    // number of days leading up to each month
                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
                    minDate: -42521673600000,
                    maxDate: 253402300799999,
                    // The number of days to add or subtract from the calendar to accommodate the variances
                    // in the start and the end of Ramadan and to accommodate the date difference between
                    // countries/regions. May be dynamically adjusted based on user preference, but should
                    // remain in the range of -2 to 2, inclusive.
                    hijriAdjustment: 0,
                    toGregorian: function(hyear, hmonth, hday) {
                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
                        // 86400000 = ticks per day
                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
                        // date in the current timezone.
                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
                        return gdate;
                    },
                    fromGregorian: function(gdate) {
                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
                        // very particular formula determined by someone smart, adapted from the server-side implementation.
                        // it approximates the hijri year.
                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
                            absDays = this.daysToYear(hyear),
                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
                        // hyear is just approximate, it may need adjustment up or down by 1.
                        if (daysSinceJan0101 < absDays) {
                            hyear--;
                            absDays -= daysInYear;
                        }
                        else if (daysSinceJan0101 === absDays) {
                            hyear--;
                            absDays = this.daysToYear(hyear);
                        }
                        else {
                            if (daysSinceJan0101 > (absDays + daysInYear)) {
                                absDays += daysInYear;
                                hyear++;
                            }
                        }
                        // determine month by looking at how many days into the hyear we are
                        // monthDays contains the number of days up to each month.
                        hmonth = 0;
                        var daysIntoYear = daysSinceJan0101 - absDays;
                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
                            hmonth++;
                        }
                        hmonth--;
                        hday = daysIntoYear - this.monthDays[hmonth];
                        return [hyear, hmonth, hday];
                    },
                    daysToYear: function(year) {
                        // calculates how many days since Jan 1, 0001
                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
                            yearsInto30 = year - yearsToYear30 - 1,
                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
                        while (yearsInto30 > 0) {
                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
                            yearsInto30--;
                        }
                        return days;
                    },
                    isLeapYear: function(year) {
                        return ((((year * 11) + 14) % 30) < 11);
                    }
			}
		},
		Gregorian_MiddleEastFrench: {
			name: "Gregorian_MiddleEastFrench",
			firstDay: 6,
			days: {
				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
				namesShort: ["di","lu","ma","me","je","ve","sa"]
			},
			months: {
				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
			},
			AM: ["ص","ص","ص"],
			PM: ["م","م","م"],
			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
			patterns: {
				d: "MM/dd/yyyy",
				t: "hh:mm tt",
				T: "hh:mm:ss tt",
				f: "dddd, MMMM dd, yyyy hh:mm tt",
				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
				M: "dd MMMM"
			}
		},
		Gregorian_Arabic: {
			name: "Gregorian_Arabic",
			firstDay: 6,
			days: {
				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
			},
			months: {
				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
			},
			AM: ["ص","ص","ص"],
			PM: ["م","م","م"],
			eras: [{"name":"م","start":null,"offset":0}],
			patterns: {
				d: "MM/dd/yyyy",
				t: "hh:mm tt",
				T: "hh:mm:ss tt",
				f: "dddd, MMMM dd, yyyy hh:mm tt",
				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
			}
		},
		Gregorian_TransliteratedFrench: {
			name: "Gregorian_TransliteratedFrench",
			firstDay: 6,
			days: {
				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
			},
			months: {
				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
			},
			AM: ["ص","ص","ص"],
			PM: ["م","م","م"],
			eras: [{"name":"م","start":null,"offset":0}],
			patterns: {
				d: "MM/dd/yyyy",
				t: "hh:mm tt",
				T: "hh:mm:ss tt",
				f: "dddd, MMMM dd, yyyy hh:mm tt",
				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
			}
		}
	}
});

}( this ));


================================================
FILE: test/libs/cultures/globalize.culture.ar-BH.js
================================================
/*
 * Globalize Culture ar-BH
 *
 * http://github.com/jquery/globalize
 *
 * Copyright Software Freedom Conservancy, Inc.
 * Dual licensed under the MIT or GPL Version 2 licenses.
 * http://jquery.org/license
 *
 * This file was generated by the Globalize Culture Generator
 * Translation: bugs found in this file need to be fixed in the generator
 */

(function( window, undefined ) {

var Globalize;

if ( typeof require !== "undefined" &&
	typeof exports !== "undefined" &&
	typeof module !== "undefined" ) {
	// Assume CommonJS
	Globalize = require( "globalize" );
} else {
	// Global variable
	Globalize = window.Globalize;
}

Globalize.addCultureInfo( "ar-BH", "default", {
	name: "ar-BH",
	englishName: "Arabic (Bahrain)",
	nativeName: "العربية (البحرين)",
	language: "ar",
	isRTL: true,
	numberFormat: {
		pattern: ["n-"],
		decimals: 3,
		"NaN": "ليس برقم",
		negativeInfinity: "-لا نهاية",
		positiveInfinity: "+لا نهاية",
		percent: {
			decimals: 3
		},
		currency: {
			pattern: ["$n-","$ n"],
			decimals: 3,
			symbol: "د.ب.\u200f"
		}
	},
	calendars: {
		standard: {
			firstDay: 6,
			days: {
				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
			},
			months: {
				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
			},
			AM: ["ص","ص","ص"],
			PM: ["م","م","م"],
			patterns: {
				d: "dd/MM/yyyy",
				D: "dd MMMM, yyyy",
				t: "hh:mm tt",
				T: "hh:mm:ss tt",
				f: "dd MMMM, yyyy hh:mm tt",
				F: "dd MMMM, yyyy hh:mm:ss tt",
				M: "dd MMMM"
			}
		},
		UmAlQura: {
			name: "UmAlQura",
			firstDay: 6,
			days: {
				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
			},
			months: {
				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
			},
			AM: ["ص","ص","ص"],
			PM: ["م","م","م"],
			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
			twoDigitYearMax: 1451,
			patterns: {
				d: "dd/MM/yy",
				D: "dd/MMMM/yyyy",
				t: "hh:mm tt",
				T: "hh:mm:ss tt",
				f: "dd/MMMM/yyyy hh:mm tt",
				F: "dd/MMMM/yyyy hh:mm:ss tt",
				M: "dd MMMM"
			},
			convert: {
                    _yearInfo: [
                        // MonthLengthFlags, Gregorian Date
                        [746, -2198707200000],
                        [1769, -2168121600000],
                        [3794, -2137449600000],
                        [3748, -2106777600000],
                        [3402, -2076192000000],
                        [2710, -2045606400000],
                        [1334, -2015020800000],
                        [2741, -1984435200000],
                        [3498, -1953763200000],
                        [2980, -1923091200000],
                        [2889, -1892505600000],
                        [2707, -1861920000000],
                        [1323, -1831334400000],
                        [2647, -1800748800000],
                        [1206, -1770076800000],
                        [2741, -1739491200000],
                        [1450, -1708819200000],
                        [3413, -1678233600000],
                        [3370, -1647561600000],
                        [2646, -1616976000000],
                        [1198, -1586390400000],
                        [2397, -1555804800000],
                        [748, -1525132800000],
                        [1749, -1494547200000],
                        [1706, -1463875200000],
                        [1365, -1433289600000],
                        [1195, -1402704000000],
                        [2395, -1372118400000],
                        [698, -1341446400000],
                        [1397, -1310860800000],
                        [2994, -1280188800000],
                        [1892, -1249516800000],
                        [1865, -1218931200000],
                        [1621, -1188345600000],
                        [683, -1157760000000],
                        [1371, -1127174400000],
                        [2778, -1096502400000],
                        [1748, -1065830400000],
                        [3785, -1035244800000],
                        [3474, -1004572800000],
                        [3365, -973987200000],
                        [2637, -943401600000],
                        [685, -912816000000],
                        [1389, -882230400000],
                        [2922, -851558400000],
                        [2898, -820886400000],
                        [2725, -790300800000],
                        [2635, -759715200000],
                        [1175, -729129600000],
                        [2359, -698544000000],
                        [694, -667872000000],
                        [1397, -637286400000],
                        [3434, -606614400000],
                        [3410, -575942400000],
                        [2710, -545356800000],
                        [2349, -514771200000],
                        [605, -484185600000],
                        [1245, -453600000000],
                        [2778, -422928000000],
                        [1492, -392256000000],
                        [3497, -361670400000],
                        [3410, -330998400000],
                        [2730, -300412800000],
                        [1238, -269827200000],
                        [2486, -239241600000],
                        [884, -208569600000],
                        [1897, -177984000000],
                        [1874, -147312000000],
                        [1701, -116726400000],
                        [1355, -86140800000],
                        [2731, -55555200000],
                        [1370, -24883200000],
                        [2773, 5702400000],
                        [3538, 36374400000],
                        [3492, 67046400000],
                        [3401, 97632000000],
                        [2709, 128217600000],
                        [1325, 158803200000],
                        [2653, 189388800000],
                        [1370, 220060800000],
                        [2773, 250646400000],
                        [1706, 281318400000],
                        [1685, 311904000000],
                        [1323, 342489600000],
                        [2647, 373075200000],
                        [1198, 403747200000],
                        [2422, 434332800000],
                        [1388, 465004800000],
                        [2901, 495590400000],
                        [2730, 526262400000],
                        [2645, 556848000000],
                        [1197, 587433600000],
                        [2397, 618019200000],
                        [730, 648691200000],
                        [1497, 679276800000],
                        [3506, 709948800000],
                        [2980, 740620800000],
                        [2890, 771206400000],
                        [2645, 801792000000],
                        [693, 832377600000],
                        [1397, 862963200000],
                        [2922, 893635200000],
                        [3026, 924307200000],
                        [3012, 954979200000],
                        [2953, 985564800000],
                        [2709, 1016150400000],
                        [1325, 1046736000000],
                        [1453, 1077321600000],
                        [2922, 1107993600000],
                        [1748, 1138665600000],
                        [3529, 1169251200000],
                        [3474, 1199923200000],
                        [2726, 1230508800000],
                        [2390, 1261094400000],
                        [686, 1291680000000],
                        [1389, 1322265600000],
                        [874, 1352937600000],
                        [2901, 1383523200000],
                        [2730, 1414195200000],
                        [2381, 1444780800000],
                        [1181, 1475366400000],
                        [2397, 1505952000000],
                        [698, 1536624000000],
                        [1461, 1567209600000],
                        [1450, 1597881600000],
                        [3413, 1628467200000],
                        [2714, 1659139200000],
                        [2350, 1689724800000],
                        [622, 1720310400000],
                        [1373, 1750896000000],
                        [2778, 1781568000000],
                        [1748, 1812240000000],
                        [1701, 1842825600000],
                        [0, 1873411200000]
                    ],
                    minDate: -2198707200000,
                    maxDate: 1873411199999,
                    toGregorian: function(hyear, hmonth, hday) {
                        var days = hday - 1,
                            gyear = hyear - 1318;
                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
                        var info = this._yearInfo[gyear],
                            gdate = new Date(info[1]),
                            monthLength = info[0];
                        // Date's ticks in javascript are always from the GMT time,
                        // but we are interested in the gregorian date in the same timezone,
                        // not what the gregorian date was at GMT time, so we adjust for the offset.
                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
                        for (var i = 0; i < hmonth; i++) {
                            days += 29 + (monthLength & 1);
                            monthLength = monthLength >> 1;
                        }
                        gdate.setDate(gdate.getDate() + days);
                        return gdate;
                    },
                    fromGregorian: function(gdate) {
                        // Date's ticks in javascript are always from the GMT time,
                        // but we are interested in the hijri date in the same timezone,
                        // not what the hijri date was at GMT time, so we adjust for the offset.
                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
                        if (ticks < this.minDate || ticks > this.maxDate) return null;
                        var hyear = 0,
                            hmonth = 1;
                        // find the earliest gregorian date in the array that is greater than or equal to the given date
                        while (ticks > this._yearInfo[++hyear][1]) { }
                        if (ticks !== this._yearInfo[hyear][1]) {
                            hyear--;
                        }
                        var info = this._yearInfo[hyear],
                            // how many days has it been since the date we found in the array?
                            // 86400000 = ticks per day
                            days = Math.floor((ticks - info[1]) / 86400000),
                            monthLength = info[0];
                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
                        // now increment day/month based on the total days, considering
                        // how many days are in each month. We cannot run past the year
                        // mark since we would have found a different array entry in that case.
                        var daysInMonth = 29 + (monthLength & 1);
                        while (days >= daysInMonth) {
                            days -= daysInMonth;
                            monthLength = monthLength >> 1;
                            daysInMonth = 29 + (monthLength & 1);
                            hmonth++;
                        }
                        // remaining days is less than is in one month, thus is the day of the month we landed on
                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
                        return [hyear, hmonth - 1, days + 1];
                    }
			}
		},
		Hijri: {
			name: "Hijri",
			firstDay: 6,
			days: {
				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
			},
			months: {
				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
			},
			AM: ["ص","ص","ص"],
			PM: ["م","م","م"],
			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
			twoDigitYearMax: 1451,
			patterns: {
				d: "dd/MM/yy",
				D: "dd/MM/yyyy",
				t: "hh:mm tt",
				T: "hh:mm:ss tt",
				f: "dd/MM/yyyy hh:mm tt",
				F: "dd/MM/yyyy hh:mm:ss tt",
				M: "dd MMMM"
			},
			convert: {
                    // Adapted to Script from System.Globalization.HijriCalendar
                    ticks1970: 62135596800000,
                    // number of days leading up to each month
                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
                    minDate: -42521673600000,
                    maxDate: 253402300799999,
                    // The number of days to add or subtract from the calendar to accommodate the variances
                    // in the start and the end of Ramadan and to accommodate the date difference between
                    // countries/regions. May be dynamically adjusted based on user preference, but should
                    // remain in the range of -2 to 2, inclusive.
                    hijriAdjustment: 0,
                    toGregorian: function(hyear, hmonth, hday) {
                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
                        // 86400000 = ticks per day
                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
                        // date in the current timezone.
                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
                        return gdate;
                    },
                    fromGregorian: function(gdate) {
                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
                        // very particular formula determined by someone smart, adapted from the server-side implementation.
                        // it approximates the hijri year.
                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
                            absDays = this.daysToYear(hyear),
                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
                        // hyear is just approximate, it may need adjustment up or down by 1.
                        if (daysSinceJan0101 < absDays) {
                            hyear--;
                            absDays -= daysInYear;
                        }
                        else if (daysSinceJan0101 === absDays) {
                            hyear--;
                            absDays = this.daysToYear(hyear);
                        }
                        else {
                            if (daysSinceJan0101 > (absDays + daysInYear)) {
                                absDays += daysInYear;
                                hyear++;
                            }
                        }
                        // determine month by looking at how many days into the hyear we are
                        // monthDays contains the number of days up to each month.
                        hmonth = 0;
                        var daysIntoYear = daysSinceJan0101 - absDays;
                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
                            hmonth++;
                        }
                        hmonth--;
                        hday = daysIntoYear - this.monthDays[hmonth];
                        return [hyear, hmonth, hday];
                    },
                    daysToYear: function(year) {
                        // calculates how many days since Jan 1, 0001
                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
                            yearsInto30 = year - yearsToYear30 - 1,
                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
                        while (yearsInto30 > 0) {
                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
                            yearsInto30--;
                        }
                        return days;
                    },
                    isLeapYear: function(year) {
                        return ((((year * 11) + 14) % 30) < 11);
                    }
			}
		},
		Gregorian_MiddleEastFrench: {
			name: "Gregorian_MiddleEastFrench",
			firstDay: 6,
			days: {
				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
				namesShort: ["di","lu","ma","me","je","ve","sa"]
			},
			months: {
				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
			},
			AM: ["ص","ص","ص"],
			PM: ["م","م","م"],
			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
			patterns: {
				d: "MM/dd/yyyy",
				t: "hh:mm tt",
				T: "hh:mm:ss tt",
				f: "dddd, MMMM dd, yyyy hh:mm tt",
				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
				M: "dd MMMM"
			}
		},
		Gregorian_Arabic: {
			name: "Gregorian_Arabic",
			firstDay: 6,
			days: {
				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
			},
			months: {
				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
			},
			AM: ["ص","ص","ص"],
			PM: ["م","م","م"],
			eras: [{"name":"م","start":null,"offset":0}],
			patterns: {
				d: "MM/dd/yyyy",
				t: "hh:mm tt",
				T: "hh:mm:ss tt",
				f: "dddd, MMMM dd, yyyy hh:mm tt",
				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
			}
		},
		Gregorian_TransliteratedFrench: {
			name: "Gregorian_TransliteratedFrench",
			firstDay: 6,
			days: {
				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
			},
			months: {
				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
			},
			AM: ["ص","ص","ص"],
			PM: ["م","م","م"],
			eras: [{"name":"م","start":null,"offset":0}],
			patterns: {
				d: "MM/dd/yyyy",
				t: "hh:mm tt",
				T: "hh:mm:ss tt",
				f: "dddd, MMMM dd, yyyy hh:mm tt",
				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
			}
		}
	}
});

}( this ));


================================================
FILE: test/libs/cultures/globalize.culture.ar-DZ.js
================================================
/*
 * Globalize Culture ar-DZ
 *
 * http://github.com/jquery/globalize
 *
 * Copyright Software Freedom Conservancy, Inc.
 * Dual licensed under the MIT or GPL Version 2 licenses.
 * http://jquery.org/license
 *
 * This file was generated by the Globalize Culture Generator
 * Translation: bugs found in this file need to be fixed in the generator
 */

(function( window, undefined ) {

var Globalize;

if ( typeof require !== "undefined" &&
	typeof exports !== "undefined" &&
	typeof module !== "undefined" ) {
	// Assume CommonJS
	Globalize = require( "globalize" );
} else {
	// Global variable
	Globalize = window.Globalize;
}

Globalize.addCultureInfo( "ar-DZ", "default", {
	name: "ar-DZ",
	englishName: "Arabic (Algeria)",
	nativeName: "العربية (الجزائر)",
	language: "ar",
	isRTL: true,
	numberFormat: {
		pattern: ["n-"],
		"NaN": "ليس برقم",
		negativeInfinity: "-لا نهاية",
		positiveInfinity: "+لا نهاية",
		currency: {
			pattern: ["$n-","$ n"],
			symbol: "د.ج.\u200f"
		}
	},
	calendars: {
		standard: {
			"/": "-",
			firstDay: 6,
			days: {
				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
			},
			months: {
				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
			},
			AM: ["ص","ص","ص"],
			PM: ["م","م","م"],
			patterns: {
				d: "dd-MM-yyyy",
				D: "dd MMMM, yyyy",
				t: "H:mm",
				T: "H:mm:ss",
				f: "dd MMMM, yyyy H:mm",
				F: "dd MMMM, yyyy H:mm:ss",
				M: "dd MMMM"
			}
		},
		Hijri: {
			name: "Hijri",
			firstDay: 6,
			days: {
				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
			},
			months: {
				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
			},
			AM: ["ص","ص","ص"],
			PM: ["م","م","م"],
			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
			twoDigitYearMax: 1451,
			patterns: {
				d: "dd/MM/yy",
				D: "dd/MM/yyyy",
				t: "H:mm",
				T: "H:mm:ss",
				f: "dd/MM/yyyy H:mm",
				F: "dd/MM/yyyy H:mm:ss",
				M: "dd MMMM"
			},
			convert: {
                    // Adapted to Script from System.Globalization.HijriCalendar
                    ticks1970: 62135596800000,
                    // number of days leading up to each month
                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
                    minDate: -42521673600000,
                    maxDate: 253402300799999,
                    // The number of days to add or subtract from the calendar to accommodate the variances
                    // in the start and the end of Ramadan and to accommodate the date difference between
                    // countries/regions. May be dynamically adjusted based on user preference, but should
                    // remain in the range of -2 to 2, inclusive.
                    hijriAdjustment: 0,
                    toGregorian: function(hyear, hmonth, hday) {
                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
                        // 86400000 = ticks per day
                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
                        // date in the current timezone.
                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
                        return gdate;
                    },
                    fromGregorian: function(gdate) {
                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
                        // very particular formula determined by someone smart, adapted from the server-side implementation.
                        // it approximates the hijri year.
                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
                            absDays = this.daysToYear(hyear),
                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
                        // hyear is just approximate, it may need adjustment up or down by 1.
                        if (daysSinceJan0101 < absDays) {
                            hyear--;
                            absDays -= daysInYear;
                        }
                        else if (daysSinceJan0101 === absDays) {
                            hyear--;
                            absDays = this.daysToYear(hyear);
                        }
                        else {
                            if (daysSinceJan0101 > (absDays + daysInYear)) {
                                absDays += daysInYear;
                                hyear++;
                            }
                        }
                        // determine month by looking at how many days into the hyear we are
                        // monthDays contains the number of days up to each month.
                        hmonth = 0;
                        var daysIntoYear = daysSinceJan0101 - absDays;
                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
                            hmonth++;
                        }
                        hmonth--;
                        hday = daysIntoYear - this.monthDays[hmonth];
                        return [hyear, hmonth, hday];
                    },
                    daysToYear: function(year) {
                        // calculates how many days since Jan 1, 0001
                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
                            yearsInto30 = year - yearsToYear30 - 1,
                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
                        while (yearsInto30 > 0) {
                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
                            yearsInto30--;
                        }
                        return days;
                    },
                    isLeapYear: function(year) {
                        return ((((year * 11) + 14) % 30) < 11);
                    }
			}
		},
		UmAlQura: {
			name: "UmAlQura",
			firstDay: 6,
			days: {
				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
			},
			months: {
				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
			},
			AM: ["ص","ص","ص"],
			PM: ["م","م","م"],
			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
			twoDigitYearMax: 1451,
			patterns: {
				d: "dd/MM/yy",
				D: "dd/MMMM/yyyy",
				t: "H:mm",
				T: "H:mm:ss",
				f: "dd/MMMM/yyyy H:mm",
				F: "dd/MMMM/yyyy H:mm:ss",
				M: "dd MMMM"
			},
			convert: {
                    _yearInfo: [
                        // MonthLengthFlags, Gregorian Date
                        [746, -2198707200000],
                        [1769, -2168121600000],
                        [3794, -2137449600000],
                        [3748, -2106777600000],
                        [3402, -2076192000000],
                        [2710, -2045606400000],
                        [1334, -2015020800000],
                        [2741, -1984435200000],
                        [3498, -1953763200000],
                        [2980, -1923091200000],
                        [2889, -1892505600000],
                        [2707, -1861920000000],
                        [1323, -1831334400000],
                        [2647, -1800748800000],
                        [1206, -1770076800000],
                        [2741, -1739491200000],
                        [1450, -1708819200000],
                        [3413, -1678233600000],
                        [3370, -1647561600000],
                        [2646, -1616976000000],
                        [1198, -1586390400000],
                        [2397, -1555804800000],
                        [748, -1525132800000],
                        [1749, -1494547200000],
                        [1706, -1463875200000],
                        [1365, -1433289600000],
                        [1195, -1402704000000],
                        [2395, -1372118400000],
                        [698, -1341446400000],
                        [1397, -1310860800000],
                        [2994, -1280188800000],
                        [1892, -1249516800000],
                        [1865, -1218931200000],
                        [1621, -1188345600000],
                        [683, -1157760000000],
                        [1371, -1127174400000],
                        [2778, -1096502400000],
                        [1748, -1065830400000],
                        [3785, -1035244800000],
                        [3474, -1004572800000],
                        [3365, -973987200000],
                        [2637, -943401600000],
                        [685, -912816000000],
                        [1389, -882230400000],
                        [2922, -851558400000],
                        [2898, -820886400000],
                        [2725, -790300800000],
                        [2635, -759715200000],
                        [1175, -729129600000],
                        [2359, -698544000000],
                        [694, -667872000000],
                        [1397, -637286400000],
                        [3434, -606614400000],
                        [3410, -575942400000],
                        [2710, -545356800000],
                        [2349, -514771200000],
                        [605, -484185600000],
                        [1245, -453600000000],
                        [2778, -422928000000],
                        [1492, -392256000000],
                        [3497, -361670400000],
                        [3410, -330998400000],
                        [2730, -300412800000],
                        [1238, -269827200000],
                        [2486, -239241600000],
                        [884, -208569600000],
                        [1897, -177984000000],
                        [1874, -147312000000],
                        [1701, -116726400000],
                        [1355, -86140800000],
                        [2731, -55555200000],
                        [1370, -24883200000],
                        [2773, 5702400000],
                        [3538, 36374400000],
                        [3492, 67046400000],
                        [3401, 97632000000],
                        [2709, 128217600000],
                        [1325, 158803200000],
                        [2653, 189388800000],
                        [1370, 220060800000],
                        [2773, 250646400000],
                        [1706, 281318400000],
                        [1685, 311904000000],
                        [1323, 342489600000],
                        [2647, 373075200000],
                        [1198, 403747200000],
                        [2422, 434332800000],
                        [1388, 465004800000],
                        [2901, 495590400000],
                        [2730, 526262400000],
                        [2645, 556848000000],
                        [1197, 587433600000],
                        [2397, 618019200000],
                        [730, 648691200000],
                        [1497, 679276800000],
                        [3506, 709948800000],
                        [2980, 740620800000],
                        [2890, 771206400000],
                        [2645, 801792000000],
                        [693, 832377600000],
                        [1397, 862963200000],
                        [2922, 893635200000],
                        [3026, 924307200000],
                        [3012, 954979200000],
                        [2953, 985564800000],
                        [2709, 1016150400000],
                        [1325, 1046736000000],
                        [1453, 1077321600000],
                        [2922, 1107993600000],
                        [1748, 1138665600000],
                        [3529, 1169251200000],
                        [3474, 1199923200000],
                        [2726, 1230508800000],
                        [2390, 1261094400000],
                        [686, 1291680000000],
                        [1389, 1322265600000],
                        [874, 1352937600000],
                        [2901, 1383523200000],
                        [2730, 1414195200000],
                        [2381, 1444780800000],
                        [1181, 1475366400000],
                        [2397, 1505952000000],
                        [698, 1536624000000],
                        [1461, 1567209600000],
                        [1450, 1597881600000],
                        [3413, 1628467200000],
                        [2714, 1659139200000],
                        [2350, 1689724800000],
                        [622, 1720310400000],
                        [1373, 1750896000000],
                        [2778, 1781568000000],
                        [1748, 1812240000000],
                        [1701, 1842825600000],
                        [0, 1873411200000]
                    ],
                    minDate: -2198707200000,
                    maxDate: 1873411199999,
                    toGregorian: function(hyear, hmonth, hday) {
                        var days = hday - 1,
                            gyear = hyear - 1318;
                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
                        var info = this._yearInfo[gyear],
                            gdate = new Date(info[1]),
                            monthLength = info[0];
                        // Date's ticks in javascript are always from the GMT time,
                        // but we are interested in the gregorian date in the same timezone,
                        // not what the gregorian date was at GMT time, so we adjust for the offset.
                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
                        for (var i = 0; i < hmonth; i++) {
                            days += 29 + (monthLength & 1);
                            monthLength = monthLength >> 1;
                        }
                        gdate.setDate(gdate.getDate() + days);
                        return gdate;
                    },
                    fromGregorian: function(gdate) {
                        // Date's ticks in javascript are always from the GMT time,
                        // but we are interested in the hijri date in the same timezone,
                        // not what the hijri date was at GMT time, so we adjust for the offset.
                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
                        if (ticks < this.minDate || ticks > this.maxDate) return null;
                        var hyear = 0,
                            hmonth = 1;
                        // find the earliest gregorian date in the array that is greater than or equal to the given date
                        while (ticks > this._yearInfo[++hyear][1]) { }
                        if (ticks !== this._yearInfo[hyear][1]) {
                            hyear--;
                        }
                        var info = this._yearInfo[hyear],
                            // how many days has it been since the date we found in the array?
                            // 86400000 = ticks per day
                            days = Math.floor((ticks - info[1]) / 86400000),
                            monthLength = info[0];
                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
                        // now increment day/month based on the total days, considering
                        // how many days are in each month. We cannot run past the year
                        // mark since we would have found a different array entry in that case.
                        var daysInMonth = 29 + (monthLength & 1);
                        while (days >= daysInMonth) {
                            days -= daysInMonth;
                            monthLength = monthLength >> 1;
                            daysInMonth = 29 + (monthLength & 1);
                            hmonth++;
                        }
                        // remaining days is less than is in one month, thus is the day of the month we landed on
                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
                        return [hyear, hmonth - 1, days + 1];
                    }
			}
		},
		Gregorian_MiddleEastFrench: {
			name: "Gregorian_MiddleEastFrench",
			firstDay: 6,
			days: {
				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
				namesShort: ["di","lu","ma","me","je","ve","sa"]
			},
			months: {
				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
			},
			AM: ["ص","ص","ص"],
			PM: ["م","م","م"],
			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
			patterns: {
				d: "MM/dd/yyyy",
				t: "H:mm",
				T: "H:mm:ss",
				f: "dddd, MMMM dd, yyyy H:mm",
				F: "dddd, MMMM dd, yyyy H:mm:ss",
				M: "dd MMMM"
			}
		},
		Gregorian_Arabic: {
			name: "Gregorian_Arabic",
			firstDay: 6,
			days: {
				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
			},
			months: {
				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
			},
			AM: ["ص","ص","ص"],
			PM: ["م","م","م"],
			eras: [{"name":"م","start":null,"offset":0}],
			patterns: {
				d: "MM/dd/yyyy",
				t: "H:mm",
				T: "H:mm:ss",
				f: "dddd, MMMM dd, yyyy H:mm",
				F: "dddd, MMMM dd, yyyy H:mm:ss"
			}
		},
		Gregorian_TransliteratedEnglish: {
			name: "Gregorian_TransliteratedEnglish",
			firstDay: 6,
			days: {
				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
			},
			months: {
				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
			},
			AM: ["ص","ص","ص"],
			PM: ["م","م","م"],
			eras: [{"name":"م","start":null,"offset":0}],
			patterns: {
				d: "MM/dd/yyyy",
				t: "H:mm",
				T: "H:mm:ss",
				f: "dddd, MMMM dd, yyyy H:mm",
				F: "dddd, MMMM dd, yyyy H:mm:ss"
			}
		}
	}
});

}( this ));


================================================
FILE: test/libs/cultures/globalize.culture.ar-EG.js
================================================
/*
 * Globalize Culture ar-EG
 *
 * http://github.com/jquery/globalize
 *
 * Copyright Software Freedom Conservancy, Inc.
 * Dual licensed under the MIT or GPL Version 2 licenses.
 * http://jquery.org/license
 *
 * This file was generated by the Globalize Culture Generator
 * Translation: bugs found in this file need to be fixed in the generator
 */

(function( window, undefined ) {

var Globalize;

if ( typeof require !== "undefined" &&
	typeof exports !== "undefined" &&
	typeof module !== "undefined" ) {
	// Assume CommonJS
	Globalize = require( "globalize" );
} else {
	// Global variable
	Globalize = window.Globalize;
}

Globalize.addCultureInfo( "ar-EG", "default", {
	name: "ar-EG",
	englishName: "Arabic (Egypt)",
	nativeName: "العربية (مصر)",
	language: "ar",
	isRTL: true,
	numberFormat: {
		pattern: ["n-"],
		decimals: 3,
		"NaN": "ليس برقم",
		negativeInfinity: "-لا نهاية",
		positiveInfinity: "+لا نهاية",
		percent: {
			decimals: 3
		},
		currency: {
			pattern: ["$n-","$ n"],
			symbol: "ج.م.\u200f"
		}
	},
	calendars: {
		standard: {
			firstDay: 6,
			days: {
				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
			},
			months: {
				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
			},
			AM: ["ص","ص","ص"],
			PM: ["م","م","م"],
			patterns: {
				d: "dd/MM/yyyy",
				D: "dd MMMM, yyyy",
				t: "hh:mm tt",
				T: "hh:mm:ss tt",
				f: "dd MMMM, yyyy hh:mm tt",
				F: "dd MMMM, yyyy hh:mm:ss tt",
				M: "dd MMMM"
			}
		},
		UmAlQura: {
			name: "UmAlQura",
			firstDay: 6,
			days: {
				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
			},
			months: {
				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
			},
			AM: ["ص","ص","ص"],
			PM: ["م","م","م"],
			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
			twoDigitYearMax: 1451,
			patterns: {
				d: "dd/MM/yy",
				D: "dd/MMMM/yyyy",
				t: "hh:mm tt",
				T: "hh:mm:ss tt",
				f: "dd/MMMM/yyyy hh:mm tt",
				F: "dd/MMMM/yyyy hh:mm:ss tt",
				M: "dd MMMM"
			},
			convert: {
                    _yearInfo: [
                        // MonthLengthFlags, Gregorian Date
                        [746, -2198707200000],
                        [1769, -2168121600000],
                        [3794, -2137449600000],
                        [3748, -2106777600000],
                        [3402, -2076192000000],
                        [2710, -2045606400000],
                        [1334, -2015020800000],
                        [2741, -1984435200000],
                        [3498, -1953763200000],
                        [2980, -1923091200000],
                        [2889, -1892505600000],
                        [2707, -1861920000000],
                        [1323, -1831334400000],
                        [2647, -1800748800000],
                        [1206, -1770076800000],
                        [2741, -1739491200000],
                        [1450, -1708819200000],
                        [3413, -1678233600000],
                        [3370, -1647561600000],
                        [2646, -1616976000000],
                        [1198, -1586390400000],
                        [2397, -1555804800000],
                        [748, -1525132800000],
                        [1749, -1494547200000],
                        [1706, -1463875200000],
                        [1365, -1433289600000],
                        [1195, -1402704000000],
                        [2395, -1372118400000],
                        [698, -1341446400000],
                        [1397, -1310860800000],
                        [2994, -1280188800000],
                        [1892, -1249516800000],
                        [1865, -1218931200000],
                        [1621, -1188345600000],
                        [683, -1157760000000],
                        [1371, -1127174400000],
                        [2778, -1096502400000],
                        [1748, -1065830400000],
                        [3785, -1035244800000],
                        [3474, -1004572800000],
                        [3365, -973987200000],
                        [2637, -943401600000],
                        [685, -912816000000],
                        [1389, -882230400000],
                        [2922, -851558400000],
                        [2898, -820886400000],
                        [2725, -790300800000],
                        [2635, -759715200000],
                        [1175, -729129600000],
                        [2359, -698544000000],
                        [694, -667872000000],
                        [1397, -637286400000],
                        [3434, -606614400000],
                        [3410, -575942400000],
                        [2710, -545356800000],
                        [2349, -514771200000],
                        [605, -484185600000],
                        [1245, -453600000000],
                        [2778, -422928000000],
                        [1492, -392256000000],
                        [3497, -361670400000],
                        [3410, -330998400000],
                        [2730, -300412800000],
                        [1238, -269827200000],
                        [2486, -239241600000],
                        [884, -208569600000],
                        [1897, -177984000000],
                        [1874, -147312000000],
                        [1701, -116726400000],
                        [1355, -86140800000],
                        [2731, -55555200000],
                        [1370, -24883200000],
                        [2773, 5702400000],
                        [3538, 36374400000],
                        [3492, 67046400000],
                        [3401, 97632000000],
                        [2709, 128217600000],
                        [1325, 158803200000],
                        [2653, 189388800000],
                        [1370, 220060800000],
                        [2773, 250646400000],
                        [1706, 281318400000],
                        [1685, 311904000000],
                        [1323, 342489600000],
                        [2647, 373075200000],
                        [1198, 403747200000],
                        [2422, 434332800000],
                        [1388, 465004800000],
                        [2901, 495590400000],
                        [2730, 526262400000],
                        [2645, 556848000000],
                        [1197, 587433600000],
                        [2397, 618019200000],
                        [730, 648691200000],
                        [1497, 679276800000],
                        [3506, 709948800000],
                        [2980, 740620800000],
                        [2890, 771206400000],
                        [2645, 801792000000],
                        [693, 832377600000],
                        [1397, 862963200000],
                        [2922, 893635200000],
                        [3026, 924307200000],
                        [3012, 954979200000],
                        [2953, 985564800000],
                        [2709, 1016150400000],
                        [1325, 1046736000000],
                        [1453, 1077321600000],
                        [2922, 1107993600000],
                        [1748, 1138665600000],
                        [3529, 1169251200000],
                        [3474, 1199923200000],
                        [2726, 1230508800000],
                        [2390, 1261094400000],
                        [686, 1291680000000],
                        [1389, 1322265600000],
                        [874, 1352937600000],
                        [2901, 1383523200000],
                        [2730, 1414195200000],
                        [2381, 1444780800000],
                        [1181, 1475366400000],
                        [2397, 1505952000000],
                        [698, 1536624000000],
                        [1461, 1567209600000],
                        [1450, 1597881600000],
                        [3413, 1628467200000],
                        [2714, 1659139200000],
                        [2350, 1689724800000],
                        [622, 1720310400000],
                        [1373, 1750896000000],
                        [2778, 1781568000000],
                        [1748, 1812240000000],
                        [1701, 1842825600000],
                        [0, 1873411200000]
                    ],
                    minDate: -2198707200000,
                    maxDate: 1873411199999,
                    toGregorian: function(hyear, hmonth, hday) {
                        var days = hday - 1,
                            gyear = hyear - 1318;
                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
                        var info = this._yearInfo[gyear],
                            gdate = new Date(info[1]),
                            monthLength = info[0];
                        // Date's ticks in javascript are always from the GMT time,
                        // but we are interested in the gregorian date in the same timezone,
                        // not what the gregorian date was at GMT time, so we adjust for the offset.
                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
                        for (var i = 0; i < hmonth; i++) {
                            days += 29 + (monthLength & 1);
                            monthLength = monthLength >> 1;
                        }
                        gdate.setDate(gdate.getDate() + days);
                        return gdate;
                    },
                    fromGregorian: function(gdate) {
                        // Date's ticks in javascript are always from the GMT time,
                        // but we are interested in the hijri date in the same timezone,
                        // not what the hijri date was at GMT time, so we adjust for the offset.
                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
                        if (ticks < this.minDate || ticks > this.maxDate) return null;
                        var hyear = 0,
                            hmonth = 1;
                        // find the earliest gregorian date in the array that is greater than or equal to the given date
                        while (ticks > this._yearInfo[++hyear][1]) { }
                        if (ticks !== this._yearInfo[hyear][1]) {
                            hyear--;
                        }
                        var info = this._yearInfo[hyear],
                            // how many days has it been since the date we found in the array?
                            // 86400000 = ticks per day
                            days = Math.floor((ticks - info[1]) / 86400000),
                            monthLength = info[0];
                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
                        // now increment day/month based on the total days, considering
                        // how many days are in each month. We cannot run past the year
                        // mark since we would have found a different array entry in that case.
                        var daysInMonth = 29 + (monthLength & 1);
                        while (days >= daysInMonth) {
                            days -= daysInMonth;
                            monthLength = monthLength >> 1;
                            daysInMonth = 29 + (monthLength & 1);
                            hmonth++;
                        }
                        // remaining days is less than is in one month, thus is the day of the month we landed on
                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
                        return [hyear, hmonth - 1, days + 1];
                    }
			}
		},
		Gregorian_TransliteratedEnglish: {
			name: "Gregorian_TransliteratedEnglish",
			firstDay: 6,
			days: {
				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
			},
			months: {
				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
			},
			AM: ["ص","ص","ص"],
			PM: ["م","م","م"],
			eras: [{"name":"م","start":null,"offset":0}],
			patterns: {
				d: "MM/dd/yyyy",
				t: "hh:mm tt",
				T: "hh:mm:ss tt",
				f: "dddd, MMMM dd, yyyy hh:mm tt",
				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
			}
		},
		Hijri: {
			name: "Hijri",
			firstDay: 6,
			days: {
				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
			},
			months: {
				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
			},
			AM: ["ص","ص","ص"],
			PM: ["م","م","م"],
			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
			twoDigitYearMax: 1451,
			patterns: {
				d: "dd/MM/yy",
				D: "dd/MM/yyyy",
				t: "hh:mm tt",
				T: "hh:mm:ss tt",
				f: "dd/MM/yyyy hh:mm tt",
				F: "dd/MM/yyyy hh:mm:ss tt",
				M: "dd MMMM"
			},
			convert: {
                    // Adapted to Script from System.Globalization.HijriCalendar
                    ticks1970: 6213559680000
Download .txt
gitextract_g3jmq8p2/

├── .gitignore
├── .npmignore
├── .travis.yml
├── Gruntfile.js
├── bower.json
├── dist/
│   ├── jquery.dform-1.0.1.js
│   └── jquery.dform-1.1.0.js
├── package.json
├── readme.md
├── src/
│   ├── dform.converters.js
│   ├── dform.core.js
│   ├── dform.extensions.js
│   └── dform.js
├── start.html
└── test/
    ├── index.html
    ├── libs/
    │   ├── cultures/
    │   │   ├── globalize.culture.af-ZA.js
    │   │   ├── globalize.culture.af.js
    │   │   ├── globalize.culture.am-ET.js
    │   │   ├── globalize.culture.am.js
    │   │   ├── globalize.culture.ar-AE.js
    │   │   ├── globalize.culture.ar-BH.js
    │   │   ├── globalize.culture.ar-DZ.js
    │   │   ├── globalize.culture.ar-EG.js
    │   │   ├── globalize.culture.ar-IQ.js
    │   │   ├── globalize.culture.ar-JO.js
    │   │   ├── globalize.culture.ar-KW.js
    │   │   ├── globalize.culture.ar-LB.js
    │   │   ├── globalize.culture.ar-LY.js
    │   │   ├── globalize.culture.ar-MA.js
    │   │   ├── globalize.culture.ar-OM.js
    │   │   ├── globalize.culture.ar-QA.js
    │   │   ├── globalize.culture.ar-SA.js
    │   │   ├── globalize.culture.ar-SY.js
    │   │   ├── globalize.culture.ar-TN.js
    │   │   ├── globalize.culture.ar-YE.js
    │   │   ├── globalize.culture.ar.js
    │   │   ├── globalize.culture.arn-CL.js
    │   │   ├── globalize.culture.arn.js
    │   │   ├── globalize.culture.as-IN.js
    │   │   ├── globalize.culture.as.js
    │   │   ├── globalize.culture.az-Cyrl-AZ.js
    │   │   ├── globalize.culture.az-Cyrl.js
    │   │   ├── globalize.culture.az-Latn-AZ.js
    │   │   ├── globalize.culture.az-Latn.js
    │   │   ├── globalize.culture.az.js
    │   │   ├── globalize.culture.ba-RU.js
    │   │   ├── globalize.culture.ba.js
    │   │   ├── globalize.culture.be-BY.js
    │   │   ├── globalize.culture.be.js
    │   │   ├── globalize.culture.bg-BG.js
    │   │   ├── globalize.culture.bg.js
    │   │   ├── globalize.culture.bn-BD.js
    │   │   ├── globalize.culture.bn-IN.js
    │   │   ├── globalize.culture.bn.js
    │   │   ├── globalize.culture.bo-CN.js
    │   │   ├── globalize.culture.bo.js
    │   │   ├── globalize.culture.br-FR.js
    │   │   ├── globalize.culture.br.js
    │   │   ├── globalize.culture.bs-Cyrl-BA.js
    │   │   ├── globalize.culture.bs-Cyrl.js
    │   │   ├── globalize.culture.bs-Latn-BA.js
    │   │   ├── globalize.culture.bs-Latn.js
    │   │   ├── globalize.culture.bs.js
    │   │   ├── globalize.culture.ca-ES.js
    │   │   ├── globalize.culture.ca.js
    │   │   ├── globalize.culture.co-FR.js
    │   │   ├── globalize.culture.co.js
    │   │   ├── globalize.culture.cs-CZ.js
    │   │   ├── globalize.culture.cs.js
    │   │   ├── globalize.culture.cy-GB.js
    │   │   ├── globalize.culture.cy.js
    │   │   ├── globalize.culture.da-DK.js
    │   │   ├── globalize.culture.da.js
    │   │   ├── globalize.culture.de-AT.js
    │   │   ├── globalize.culture.de-CH.js
    │   │   ├── globalize.culture.de-DE.js
    │   │   ├── globalize.culture.de-LI.js
    │   │   ├── globalize.culture.de-LU.js
    │   │   ├── globalize.culture.de.js
    │   │   ├── globalize.culture.dsb-DE.js
    │   │   ├── globalize.culture.dsb.js
    │   │   ├── globalize.culture.dv-MV.js
    │   │   ├── globalize.culture.dv.js
    │   │   ├── globalize.culture.el-GR.js
    │   │   ├── globalize.culture.el.js
    │   │   ├── globalize.culture.en-029.js
    │   │   ├── globalize.culture.en-AU.js
    │   │   ├── globalize.culture.en-BZ.js
    │   │   ├── globalize.culture.en-CA.js
    │   │   ├── globalize.culture.en-GB.js
    │   │   ├── globalize.culture.en-IE.js
    │   │   ├── globalize.culture.en-IN.js
    │   │   ├── globalize.culture.en-JM.js
    │   │   ├── globalize.culture.en-MY.js
    │   │   ├── globalize.culture.en-NZ.js
    │   │   ├── globalize.culture.en-PH.js
    │   │   ├── globalize.culture.en-SG.js
    │   │   ├── globalize.culture.en-TT.js
    │   │   ├── globalize.culture.en-US.js
    │   │   ├── globalize.culture.en-ZA.js
    │   │   ├── globalize.culture.en-ZW.js
    │   │   ├── globalize.culture.es-AR.js
    │   │   ├── globalize.culture.es-BO.js
    │   │   ├── globalize.culture.es-CL.js
    │   │   ├── globalize.culture.es-CO.js
    │   │   ├── globalize.culture.es-CR.js
    │   │   ├── globalize.culture.es-DO.js
    │   │   ├── globalize.culture.es-EC.js
    │   │   ├── globalize.culture.es-ES.js
    │   │   ├── globalize.culture.es-GT.js
    │   │   ├── globalize.culture.es-HN.js
    │   │   ├── globalize.culture.es-MX.js
    │   │   ├── globalize.culture.es-NI.js
    │   │   ├── globalize.culture.es-PA.js
    │   │   ├── globalize.culture.es-PE.js
    │   │   ├── globalize.culture.es-PR.js
    │   │   ├── globalize.culture.es-PY.js
    │   │   ├── globalize.culture.es-SV.js
    │   │   ├── globalize.culture.es-US.js
    │   │   ├── globalize.culture.es-UY.js
    │   │   ├── globalize.culture.es-VE.js
    │   │   ├── globalize.culture.es.js
    │   │   ├── globalize.culture.et-EE.js
    │   │   ├── globalize.culture.et.js
    │   │   ├── globalize.culture.eu-ES.js
    │   │   ├── globalize.culture.eu.js
    │   │   ├── globalize.culture.fa-IR.js
    │   │   ├── globalize.culture.fa.js
    │   │   ├── globalize.culture.fi-FI.js
    │   │   ├── globalize.culture.fi.js
    │   │   ├── globalize.culture.fil-PH.js
    │   │   ├── globalize.culture.fil.js
    │   │   ├── globalize.culture.fo-FO.js
    │   │   ├── globalize.culture.fo.js
    │   │   ├── globalize.culture.fr-BE.js
    │   │   ├── globalize.culture.fr-CA.js
    │   │   ├── globalize.culture.fr-CH.js
    │   │   ├── globalize.culture.fr-FR.js
    │   │   ├── globalize.culture.fr-LU.js
    │   │   ├── globalize.culture.fr-MC.js
    │   │   ├── globalize.culture.fr.js
    │   │   ├── globalize.culture.fy-NL.js
    │   │   ├── globalize.culture.fy.js
    │   │   ├── globalize.culture.ga-IE.js
    │   │   ├── globalize.culture.ga.js
    │   │   ├── globalize.culture.gd-GB.js
    │   │   ├── globalize.culture.gd.js
    │   │   ├── globalize.culture.gl-ES.js
    │   │   ├── globalize.culture.gl.js
    │   │   ├── globalize.culture.gsw-FR.js
    │   │   ├── globalize.culture.gsw.js
    │   │   ├── globalize.culture.gu-IN.js
    │   │   ├── globalize.culture.gu.js
    │   │   ├── globalize.culture.ha-Latn-NG.js
    │   │   ├── globalize.culture.ha-Latn.js
    │   │   ├── globalize.culture.ha.js
    │   │   ├── globalize.culture.he-IL.js
    │   │   ├── globalize.culture.he.js
    │   │   ├── globalize.culture.hi-IN.js
    │   │   ├── globalize.culture.hi.js
    │   │   ├── globalize.culture.hr-BA.js
    │   │   ├── globalize.culture.hr-HR.js
    │   │   ├── globalize.culture.hr.js
    │   │   ├── globalize.culture.hsb-DE.js
    │   │   ├── globalize.culture.hsb.js
    │   │   ├── globalize.culture.hu-HU.js
    │   │   ├── globalize.culture.hu.js
    │   │   ├── globalize.culture.hy-AM.js
    │   │   ├── globalize.culture.hy.js
    │   │   ├── globalize.culture.id-ID.js
    │   │   ├── globalize.culture.id.js
    │   │   ├── globalize.culture.ig-NG.js
    │   │   ├── globalize.culture.ig.js
    │   │   ├── globalize.culture.ii-CN.js
    │   │   ├── globalize.culture.ii.js
    │   │   ├── globalize.culture.is-IS.js
    │   │   ├── globalize.culture.is.js
    │   │   ├── globalize.culture.it-CH.js
    │   │   ├── globalize.culture.it-IT.js
    │   │   ├── globalize.culture.it.js
    │   │   ├── globalize.culture.iu-Cans-CA.js
    │   │   ├── globalize.culture.iu-Cans.js
    │   │   ├── globalize.culture.iu-Latn-CA.js
    │   │   ├── globalize.culture.iu-Latn.js
    │   │   ├── globalize.culture.iu.js
    │   │   ├── globalize.culture.ja-JP.js
    │   │   ├── globalize.culture.ja.js
    │   │   ├── globalize.culture.ka-GE.js
    │   │   ├── globalize.culture.ka.js
    │   │   ├── globalize.culture.kk-KZ.js
    │   │   ├── globalize.culture.kk.js
    │   │   ├── globalize.culture.kl-GL.js
    │   │   ├── globalize.culture.kl.js
    │   │   ├── globalize.culture.km-KH.js
    │   │   ├── globalize.culture.km.js
    │   │   ├── globalize.culture.kn-IN.js
    │   │   ├── globalize.culture.kn.js
    │   │   ├── globalize.culture.ko-KR.js
    │   │   ├── globalize.culture.ko.js
    │   │   ├── globalize.culture.kok-IN.js
    │   │   ├── globalize.culture.kok.js
    │   │   ├── globalize.culture.ky-KG.js
    │   │   ├── globalize.culture.ky.js
    │   │   ├── globalize.culture.lb-LU.js
    │   │   ├── globalize.culture.lb.js
    │   │   ├── globalize.culture.lo-LA.js
    │   │   ├── globalize.culture.lo.js
    │   │   ├── globalize.culture.lt-LT.js
    │   │   ├── globalize.culture.lt.js
    │   │   ├── globalize.culture.lv-LV.js
    │   │   ├── globalize.culture.lv.js
    │   │   ├── globalize.culture.mi-NZ.js
    │   │   ├── globalize.culture.mi.js
    │   │   ├── globalize.culture.mk-MK.js
    │   │   ├── globalize.culture.mk.js
    │   │   ├── globalize.culture.ml-IN.js
    │   │   ├── globalize.culture.ml.js
    │   │   ├── globalize.culture.mn-Cyrl.js
    │   │   ├── globalize.culture.mn-MN.js
    │   │   ├── globalize.culture.mn-Mong-CN.js
    │   │   ├── globalize.culture.mn-Mong.js
    │   │   ├── globalize.culture.mn.js
    │   │   ├── globalize.culture.moh-CA.js
    │   │   ├── globalize.culture.moh.js
    │   │   ├── globalize.culture.mr-IN.js
    │   │   ├── globalize.culture.mr.js
    │   │   ├── globalize.culture.ms-BN.js
    │   │   ├── globalize.culture.ms-MY.js
    │   │   ├── globalize.culture.ms.js
    │   │   ├── globalize.culture.mt-MT.js
    │   │   ├── globalize.culture.mt.js
    │   │   ├── globalize.culture.nb-NO.js
    │   │   ├── globalize.culture.nb.js
    │   │   ├── globalize.culture.ne-NP.js
    │   │   ├── globalize.culture.ne.js
    │   │   ├── globalize.culture.nl-BE.js
    │   │   ├── globalize.culture.nl-NL.js
    │   │   ├── globalize.culture.nl.js
    │   │   ├── globalize.culture.nn-NO.js
    │   │   ├── globalize.culture.nn.js
    │   │   ├── globalize.culture.no.js
    │   │   ├── globalize.culture.nso-ZA.js
    │   │   ├── globalize.culture.nso.js
    │   │   ├── globalize.culture.oc-FR.js
    │   │   ├── globalize.culture.oc.js
    │   │   ├── globalize.culture.or-IN.js
    │   │   ├── globalize.culture.or.js
    │   │   ├── globalize.culture.pa-IN.js
    │   │   ├── globalize.culture.pa.js
    │   │   ├── globalize.culture.pl-PL.js
    │   │   ├── globalize.culture.pl.js
    │   │   ├── globalize.culture.prs-AF.js
    │   │   ├── globalize.culture.prs.js
    │   │   ├── globalize.culture.ps-AF.js
    │   │   ├── globalize.culture.ps.js
    │   │   ├── globalize.culture.pt-BR.js
    │   │   ├── globalize.culture.pt-PT.js
    │   │   ├── globalize.culture.pt.js
    │   │   ├── globalize.culture.qut-GT.js
    │   │   ├── globalize.culture.qut.js
    │   │   ├── globalize.culture.quz-BO.js
    │   │   ├── globalize.culture.quz-EC.js
    │   │   ├── globalize.culture.quz-PE.js
    │   │   ├── globalize.culture.quz.js
    │   │   ├── globalize.culture.rm-CH.js
    │   │   ├── globalize.culture.rm.js
    │   │   ├── globalize.culture.ro-RO.js
    │   │   ├── globalize.culture.ro.js
    │   │   ├── globalize.culture.ru-RU.js
    │   │   ├── globalize.culture.ru.js
    │   │   ├── globalize.culture.rw-RW.js
    │   │   ├── globalize.culture.rw.js
    │   │   ├── globalize.culture.sa-IN.js
    │   │   ├── globalize.culture.sa.js
    │   │   ├── globalize.culture.sah-RU.js
    │   │   ├── globalize.culture.sah.js
    │   │   ├── globalize.culture.se-FI.js
    │   │   ├── globalize.culture.se-NO.js
    │   │   ├── globalize.culture.se-SE.js
    │   │   ├── globalize.culture.se.js
    │   │   ├── globalize.culture.si-LK.js
    │   │   ├── globalize.culture.si.js
    │   │   ├── globalize.culture.sk-SK.js
    │   │   ├── globalize.culture.sk.js
    │   │   ├── globalize.culture.sl-SI.js
    │   │   ├── globalize.culture.sl.js
    │   │   ├── globalize.culture.sma-NO.js
    │   │   ├── globalize.culture.sma-SE.js
    │   │   ├── globalize.culture.sma.js
    │   │   ├── globalize.culture.smj-NO.js
    │   │   ├── globalize.culture.smj-SE.js
    │   │   ├── globalize.culture.smj.js
    │   │   ├── globalize.culture.smn-FI.js
    │   │   ├── globalize.culture.smn.js
    │   │   ├── globalize.culture.sms-FI.js
    │   │   ├── globalize.culture.sms.js
    │   │   ├── globalize.culture.sq-AL.js
    │   │   ├── globalize.culture.sq.js
    │   │   ├── globalize.culture.sr-Cyrl-BA.js
    │   │   ├── globalize.culture.sr-Cyrl-CS.js
    │   │   ├── globalize.culture.sr-Cyrl-ME.js
    │   │   ├── globalize.culture.sr-Cyrl-RS.js
    │   │   ├── globalize.culture.sr-Cyrl.js
    │   │   ├── globalize.culture.sr-Latn-BA.js
    │   │   ├── globalize.culture.sr-Latn-CS.js
    │   │   ├── globalize.culture.sr-Latn-ME.js
    │   │   ├── globalize.culture.sr-Latn-RS.js
    │   │   ├── globalize.culture.sr-Latn.js
    │   │   ├── globalize.culture.sr.js
    │   │   ├── globalize.culture.sv-FI.js
    │   │   ├── globalize.culture.sv-SE.js
    │   │   ├── globalize.culture.sv.js
    │   │   ├── globalize.culture.sw-KE.js
    │   │   ├── globalize.culture.sw.js
    │   │   ├── globalize.culture.syr-SY.js
    │   │   ├── globalize.culture.syr.js
    │   │   ├── globalize.culture.ta-IN.js
    │   │   ├── globalize.culture.ta.js
    │   │   ├── globalize.culture.te-IN.js
    │   │   ├── globalize.culture.te.js
    │   │   ├── globalize.culture.tg-Cyrl-TJ.js
    │   │   ├── globalize.culture.tg-Cyrl.js
    │   │   ├── globalize.culture.tg.js
    │   │   ├── globalize.culture.th-TH.js
    │   │   ├── globalize.culture.th.js
    │   │   ├── globalize.culture.tk-TM.js
    │   │   ├── globalize.culture.tk.js
    │   │   ├── globalize.culture.tn-ZA.js
    │   │   ├── globalize.culture.tn.js
    │   │   ├── globalize.culture.tr-TR.js
    │   │   ├── globalize.culture.tr.js
    │   │   ├── globalize.culture.tt-RU.js
    │   │   ├── globalize.culture.tt.js
    │   │   ├── globalize.culture.tzm-Latn-DZ.js
    │   │   ├── globalize.culture.tzm-Latn.js
    │   │   ├── globalize.culture.tzm.js
    │   │   ├── globalize.culture.ug-CN.js
    │   │   ├── globalize.culture.ug.js
    │   │   ├── globalize.culture.uk-UA.js
    │   │   ├── globalize.culture.uk.js
    │   │   ├── globalize.culture.ur-PK.js
    │   │   ├── globalize.culture.ur.js
    │   │   ├── globalize.culture.uz-Cyrl-UZ.js
    │   │   ├── globalize.culture.uz-Cyrl.js
    │   │   ├── globalize.culture.uz-Latn-UZ.js
    │   │   ├── globalize.culture.uz-Latn.js
    │   │   ├── globalize.culture.uz.js
    │   │   ├── globalize.culture.vi-VN.js
    │   │   ├── globalize.culture.vi.js
    │   │   ├── globalize.culture.wo-SN.js
    │   │   ├── globalize.culture.wo.js
    │   │   ├── globalize.culture.xh-ZA.js
    │   │   ├── globalize.culture.xh.js
    │   │   ├── globalize.culture.yo-NG.js
    │   │   ├── globalize.culture.yo.js
    │   │   ├── globalize.culture.zh-CHS.js
    │   │   ├── globalize.culture.zh-CHT.js
    │   │   ├── globalize.culture.zh-CN.js
    │   │   ├── globalize.culture.zh-HK.js
    │   │   ├── globalize.culture.zh-Hans.js
    │   │   ├── globalize.culture.zh-Hant.js
    │   │   ├── globalize.culture.zh-MO.js
    │   │   ├── globalize.culture.zh-SG.js
    │   │   ├── globalize.culture.zh-TW.js
    │   │   ├── globalize.culture.zh.js
    │   │   ├── globalize.culture.zu-ZA.js
    │   │   ├── globalize.culture.zu.js
    │   │   └── globalize.cultures.js
    │   └── globalize.js
    ├── test.js
    ├── test.json
    ├── test_extensions.js
    ├── test_jqueryui.js
    ├── test_subscribers.js
    └── test_types.js
Download .txt
SYMBOL INDEX (3 symbols across 1 files)

FILE: test/libs/globalize.js
  function padZeros (line 487) | function padZeros( num, c ) {
  function hasDay (line 499) | function hasDay() {
  function getPart (line 508) | function getPart( date, part ) {
Condensed preview — 375 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,480K chars).
[
  {
    "path": ".gitignore",
    "chars": 102,
    "preview": ".project\n*.settings/\n/.project\n/.project\n/build/compiler**\ntmp/**\ndocs**\n.idea\nnode_modules\ntestee.log"
  },
  {
    "path": ".npmignore",
    "chars": 7,
    "preview": ".idea/\n"
  },
  {
    "path": ".travis.yml",
    "chars": 36,
    "preview": "language: node_js\nnode_js:\n  - 0.10\n"
  },
  {
    "path": "Gruntfile.js",
    "chars": 1003,
    "preview": "module.exports = function (grunt) {\n\tgrunt.initConfig({\n\t\tpkg: grunt.file.readJSON('package.json'),\n\t\tconnect: {\n\t\t\tserv"
  },
  {
    "path": "bower.json",
    "chars": 178,
    "preview": "{\n\t\"name\": \"jquery.dform\",\n\t\"version\": \"1.1.0\",\n\t\"main\": \"dist/jquery.dform-1.1.0.js\",\n\t\"ignore\": [\n\t\t\".jshintrc\",\n\t\t\"**"
  },
  {
    "path": "dist/jquery.dform-1.0.1.js",
    "chars": 25940,
    "preview": "/*\n * jQuery dform plugin\n * Copyright (C) 2012 David Luecke <daff@neyeon.com>, [http://daffl.github.com/jquery.dform]\n "
  },
  {
    "path": "dist/jquery.dform-1.1.0.js",
    "chars": 25974,
    "preview": "/*\n * jQuery dform plugin\n * Copyright (C) 2012 David Luecke <daff@neyeon.com>, [http://daffl.github.com/jquery.dform]\n "
  },
  {
    "path": "package.json",
    "chars": 623,
    "preview": "{\n  \"name\": \"jquery.dform\",\n  \"description\": \"A flexible JavaScript Object and JSON to HTML converter with a focus on fo"
  },
  {
    "path": "readme.md",
    "chars": 25372,
    "preview": "The jQuery.dForm plugin generates HTML markup from JavaScript objects and [JSON](http://json.org)\nwith a focus on HTML f"
  },
  {
    "path": "src/dform.converters.js",
    "chars": 2020,
    "preview": "/*\n * jQuery dform plugin\n * Copyright (C) 2011 David Luecke <daff@neyeon.de>\n * \n * Licensed under the MIT license\n */\n"
  },
  {
    "path": "src/dform.core.js",
    "chars": 6300,
    "preview": "/*\n * jQuery dform plugin\n * Copyright (C) 2012 David Luecke <daff@neyeon.com>, [http://daffl.github.com/jquery.dform]\n "
  },
  {
    "path": "src/dform.extensions.js",
    "chars": 9234,
    "preview": "/*\n * jQuery dform plugin\n * Copyright (C) 2012 David Luecke <daff@neyeon.com>, [http://daffl.github.com/jquery.dform]\n "
  },
  {
    "path": "src/dform.js",
    "chars": 10438,
    "preview": "/*\n * jQuery dform plugin\n * Copyright (C) 2012 David Luecke <daff@neyeon.com>, [http://daffl.github.com/jquery.dform]\n "
  },
  {
    "path": "start.html",
    "chars": 5744,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n    <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n    <title>Get sta"
  },
  {
    "path": "test/index.html",
    "chars": 1533,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n\t<script src=\"http://code.jquery.com/jquery-latest.js\"></script>\n\t<link rel=\"stylesheet\" h"
  },
  {
    "path": "test/libs/cultures/globalize.culture.af-ZA.js",
    "chars": 1644,
    "preview": "/*\n * Globalize Culture af-ZA\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.af.js",
    "chars": 1606,
    "preview": "/*\n * Globalize Culture af\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.am-ET.js",
    "chars": 1778,
    "preview": "/*\n * Globalize Culture am-ET\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.am.js",
    "chars": 1750,
    "preview": "/*\n * Globalize Culture am\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.ar-AE.js",
    "chars": 20433,
    "preview": "/*\n * Globalize Culture ar-AE\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.ar-BH.js",
    "chars": 20481,
    "preview": "/*\n * Globalize Culture ar-BH\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.ar-DZ.js",
    "chars": 20336,
    "preview": "/*\n * Globalize Culture ar-DZ\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.ar-EG.js",
    "chars": 21297,
    "preview": "/*\n * Globalize Culture ar-EG\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.ar-IQ.js",
    "chars": 20443,
    "preview": "/*\n * Globalize Culture ar-IQ\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.ar-JO.js",
    "chars": 20509,
    "preview": "/*\n * Globalize Culture ar-JO\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.ar-KW.js",
    "chars": 20479,
    "preview": "/*\n * Globalize Culture ar-KW\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.ar-LB.js",
    "chars": 20445,
    "preview": "/*\n * Globalize Culture ar-LB\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.ar-LY.js",
    "chars": 20476,
    "preview": "/*\n * Globalize Culture ar-LY\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.ar-MA.js",
    "chars": 20339,
    "preview": "/*\n * Globalize Culture ar-MA\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.ar-OM.js",
    "chars": 20427,
    "preview": "/*\n * Globalize Culture ar-OM\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.ar-QA.js",
    "chars": 20411,
    "preview": "/*\n * Globalize Culture ar-QA\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.ar-SA.js",
    "chars": 20450,
    "preview": "/*\n * Globalize Culture ar-SA\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.ar-SY.js",
    "chars": 20443,
    "preview": "/*\n * Globalize Culture ar-SY\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.ar-TN.js",
    "chars": 20397,
    "preview": "/*\n * Globalize Culture ar-TN\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.ar-YE.js",
    "chars": 20413,
    "preview": "/*\n * Globalize Culture ar-YE\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.ar.js",
    "chars": 20399,
    "preview": "/*\n * Globalize Culture ar\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.arn-CL.js",
    "chars": 1870,
    "preview": "/*\n * Globalize Culture arn-CL\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, In"
  },
  {
    "path": "test/libs/cultures/globalize.culture.arn.js",
    "chars": 1845,
    "preview": "/*\n * Globalize Culture arn\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n"
  },
  {
    "path": "test/libs/cultures/globalize.culture.as-IN.js",
    "chars": 1961,
    "preview": "/*\n * Globalize Culture as-IN\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.as.js",
    "chars": 1937,
    "preview": "/*\n * Globalize Culture as\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.az-Cyrl-AZ.js",
    "chars": 1999,
    "preview": "/*\n * Globalize Culture az-Cyrl-AZ\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy"
  },
  {
    "path": "test/libs/cultures/globalize.culture.az-Cyrl.js",
    "chars": 1970,
    "preview": "/*\n * Globalize Culture az-Cyrl\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, I"
  },
  {
    "path": "test/libs/cultures/globalize.culture.az-Latn-AZ.js",
    "chars": 2003,
    "preview": "/*\n * Globalize Culture az-Latn-AZ\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy"
  },
  {
    "path": "test/libs/cultures/globalize.culture.az-Latn.js",
    "chars": 1969,
    "preview": "/*\n * Globalize Culture az-Latn\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, I"
  },
  {
    "path": "test/libs/cultures/globalize.culture.az.js",
    "chars": 1941,
    "preview": "/*\n * Globalize Culture az\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.ba-RU.js",
    "chars": 1847,
    "preview": "/*\n * Globalize Culture ba-RU\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.ba.js",
    "chars": 1820,
    "preview": "/*\n * Globalize Culture ba\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.be-BY.js",
    "chars": 1972,
    "preview": "/*\n * Globalize Culture be-BY\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.be.js",
    "chars": 1942,
    "preview": "/*\n * Globalize Culture be\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.bg-BG.js",
    "chars": 1894,
    "preview": "/*\n * Globalize Culture bg-BG\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.bg.js",
    "chars": 1863,
    "preview": "/*\n * Globalize Culture bg\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.bn-BD.js",
    "chars": 1818,
    "preview": "/*\n * Globalize Culture bn-BD\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.bn-IN.js",
    "chars": 1810,
    "preview": "/*\n * Globalize Culture bn-IN\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.bn.js",
    "chars": 1786,
    "preview": "/*\n * Globalize Culture bn\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.bo-CN.js",
    "chars": 2163,
    "preview": "/*\n * Globalize Culture bo-CN\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.bo.js",
    "chars": 2111,
    "preview": "/*\n * Globalize Culture bo\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.br-FR.js",
    "chars": 1839,
    "preview": "/*\n * Globalize Culture br-FR\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.br.js",
    "chars": 1813,
    "preview": "/*\n * Globalize Culture br\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.bs-Cyrl-BA.js",
    "chars": 1860,
    "preview": "/*\n * Globalize Culture bs-Cyrl-BA\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy"
  },
  {
    "path": "test/libs/cultures/globalize.culture.bs-Cyrl.js",
    "chars": 1805,
    "preview": "/*\n * Globalize Culture bs-Cyrl\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, I"
  },
  {
    "path": "test/libs/cultures/globalize.culture.bs-Latn-BA.js",
    "chars": 1762,
    "preview": "/*\n * Globalize Culture bs-Latn-BA\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy"
  },
  {
    "path": "test/libs/cultures/globalize.culture.bs-Latn.js",
    "chars": 1707,
    "preview": "/*\n * Globalize Culture bs-Latn\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, I"
  },
  {
    "path": "test/libs/cultures/globalize.culture.bs.js",
    "chars": 1679,
    "preview": "/*\n * Globalize Culture bs\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.ca-ES.js",
    "chars": 1875,
    "preview": "/*\n * Globalize Culture ca-ES\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.ca.js",
    "chars": 1847,
    "preview": "/*\n * Globalize Culture ca\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.co-FR.js",
    "chars": 1885,
    "preview": "/*\n * Globalize Culture co-FR\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.co.js",
    "chars": 1858,
    "preview": "/*\n * Globalize Culture co\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.cs-CZ.js",
    "chars": 2111,
    "preview": "/*\n * Globalize Culture cs-CZ\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.cs.js",
    "chars": 2067,
    "preview": "/*\n * Globalize Culture cs\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.cy-GB.js",
    "chars": 1724,
    "preview": "/*\n * Globalize Culture cy-GB\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.cy.js",
    "chars": 1679,
    "preview": "/*\n * Globalize Culture cy\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.da-DK.js",
    "chars": 1753,
    "preview": "/*\n * Globalize Culture da-DK\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.da.js",
    "chars": 1724,
    "preview": "/*\n * Globalize Culture da\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.de-AT.js",
    "chars": 1899,
    "preview": "/*\n * Globalize Culture de-AT\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.de-CH.js",
    "chars": 1860,
    "preview": "/*\n * Globalize Culture de-CH\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.de-DE.js",
    "chars": 1897,
    "preview": "/*\n * Globalize Culture de-DE\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.de-LI.js",
    "chars": 1868,
    "preview": "/*\n * Globalize Culture de-LI\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.de-LU.js",
    "chars": 1898,
    "preview": "/*\n * Globalize Culture de-LU\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.de.js",
    "chars": 1864,
    "preview": "/*\n * Globalize Culture de\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.dsb-DE.js",
    "chars": 2170,
    "preview": "/*\n * Globalize Culture dsb-DE\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, In"
  },
  {
    "path": "test/libs/cultures/globalize.culture.dsb.js",
    "chars": 2142,
    "preview": "/*\n * Globalize Culture dsb\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n"
  },
  {
    "path": "test/libs/cultures/globalize.culture.dv-MV.js",
    "chars": 7212,
    "preview": "/*\n * Globalize Culture dv-MV\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.dv.js",
    "chars": 7180,
    "preview": "/*\n * Globalize Culture dv\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.el-GR.js",
    "chars": 2172,
    "preview": "/*\n * Globalize Culture el-GR\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.el.js",
    "chars": 2145,
    "preview": "/*\n * Globalize Culture el\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.en-029.js",
    "chars": 944,
    "preview": "/*\n * Globalize Culture en-029\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, In"
  },
  {
    "path": "test/libs/cultures/globalize.culture.en-AU.js",
    "chars": 1081,
    "preview": "/*\n * Globalize Culture en-AU\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.en-BZ.js",
    "chars": 1120,
    "preview": "/*\n * Globalize Culture en-BZ\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.en-CA.js",
    "chars": 1001,
    "preview": "/*\n * Globalize Culture en-CA\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.en-GB.js",
    "chars": 1124,
    "preview": "/*\n * Globalize Culture en-GB\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.en-IE.js",
    "chars": 1136,
    "preview": "/*\n * Globalize Culture en-IE\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.en-IN.js",
    "chars": 1185,
    "preview": "/*\n * Globalize Culture en-IN\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.en-JM.js",
    "chars": 1060,
    "preview": "/*\n * Globalize Culture en-JM\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.en-MY.js",
    "chars": 1141,
    "preview": "/*\n * Globalize Culture en-MY\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.en-NZ.js",
    "chars": 1147,
    "preview": "/*\n * Globalize Culture en-NZ\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.en-PH.js",
    "chars": 861,
    "preview": "/*\n * Globalize Culture en-PH\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.en-SG.js",
    "chars": 1108,
    "preview": "/*\n * Globalize Culture en-SG\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.en-TT.js",
    "chars": 1144,
    "preview": "/*\n * Globalize Culture en-TT\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.en-US.js",
    "chars": 753,
    "preview": "/*\n * Globalize Culture en-US\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.en-ZA.js",
    "chars": 1211,
    "preview": "/*\n * Globalize Culture en-ZA\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.en-ZW.js",
    "chars": 838,
    "preview": "/*\n * Globalize Culture en-ZW\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.es-AR.js",
    "chars": 1906,
    "preview": "/*\n * Globalize Culture es-AR\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.es-BO.js",
    "chars": 1921,
    "preview": "/*\n * Globalize Culture es-BO\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.es-CL.js",
    "chars": 1860,
    "preview": "/*\n * Globalize Culture es-CL\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.es-CO.js",
    "chars": 1906,
    "preview": "/*\n * Globalize Culture es-CO\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.es-CR.js",
    "chars": 1897,
    "preview": "/*\n * Globalize Culture es-CR\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.es-DO.js",
    "chars": 1824,
    "preview": "/*\n * Globalize Culture es-DO\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.es-EC.js",
    "chars": 1852,
    "preview": "/*\n * Globalize Culture es-EC\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.es-ES.js",
    "chars": 1930,
    "preview": "/*\n * Globalize Culture es-ES\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.es-GT.js",
    "chars": 1802,
    "preview": "/*\n * Globalize Culture es-GT\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.es-HN.js",
    "chars": 1851,
    "preview": "/*\n * Globalize Culture es-HN\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.es-MX.js",
    "chars": 1806,
    "preview": "/*\n * Globalize Culture es-MX\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.es-NI.js",
    "chars": 1854,
    "preview": "/*\n * Globalize Culture es-NI\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.es-PA.js",
    "chars": 1827,
    "preview": "/*\n * Globalize Culture es-PA\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.es-PE.js",
    "chars": 1822,
    "preview": "/*\n * Globalize Culture es-PE\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.es-PR.js",
    "chars": 1841,
    "preview": "/*\n * Globalize Culture es-PR\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.es-PY.js",
    "chars": 1939,
    "preview": "/*\n * Globalize Culture es-PY\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.es-SV.js",
    "chars": 1812,
    "preview": "/*\n * Globalize Culture es-SV\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.es-US.js",
    "chars": 1580,
    "preview": "/*\n * Globalize Culture es-US\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.es-UY.js",
    "chars": 1937,
    "preview": "/*\n * Globalize Culture es-UY\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.es-VE.js",
    "chars": 1976,
    "preview": "/*\n * Globalize Culture es-VE\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.es.js",
    "chars": 1854,
    "preview": "/*\n * Globalize Culture es\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.et-EE.js",
    "chars": 1867,
    "preview": "/*\n * Globalize Culture et-EE\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.et.js",
    "chars": 1840,
    "preview": "/*\n * Globalize Culture et\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.eu-ES.js",
    "chars": 1890,
    "preview": "/*\n * Globalize Culture eu-ES\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.eu.js",
    "chars": 1862,
    "preview": "/*\n * Globalize Culture eu\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.fa-IR.js",
    "chars": 8723,
    "preview": "/*\n * Globalize Culture fa-IR\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.fa.js",
    "chars": 8706,
    "preview": "/*\n * Globalize Culture fa\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.fi-FI.js",
    "chars": 1818,
    "preview": "/*\n * Globalize Culture fi-FI\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.fi.js",
    "chars": 1791,
    "preview": "/*\n * Globalize Culture fi\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.fil-PH.js",
    "chars": 1410,
    "preview": "/*\n * Globalize Culture fil-PH\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, In"
  },
  {
    "path": "test/libs/cultures/globalize.culture.fil.js",
    "chars": 1375,
    "preview": "/*\n * Globalize Culture fil\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n"
  },
  {
    "path": "test/libs/cultures/globalize.culture.fo-FO.js",
    "chars": 1820,
    "preview": "/*\n * Globalize Culture fo-FO\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.fo.js",
    "chars": 1785,
    "preview": "/*\n * Globalize Culture fo\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.fr-BE.js",
    "chars": 1873,
    "preview": "/*\n * Globalize Culture fr-BE\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.fr-CA.js",
    "chars": 1818,
    "preview": "/*\n * Globalize Culture fr-CA\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.fr-CH.js",
    "chars": 1852,
    "preview": "/*\n * Globalize Culture fr-CH\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.fr-FR.js",
    "chars": 1871,
    "preview": "/*\n * Globalize Culture fr-FR\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.fr-LU.js",
    "chars": 1879,
    "preview": "/*\n * Globalize Culture fr-LU\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.fr-MC.js",
    "chars": 1886,
    "preview": "/*\n * Globalize Culture fr-MC\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.fr.js",
    "chars": 1844,
    "preview": "/*\n * Globalize Culture fr\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.fy-NL.js",
    "chars": 1720,
    "preview": "/*\n * Globalize Culture fy-NL\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.fy.js",
    "chars": 1686,
    "preview": "/*\n * Globalize Culture fy\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.ga-IE.js",
    "chars": 1694,
    "preview": "/*\n * Globalize Culture ga-IE\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.ga.js",
    "chars": 1668,
    "preview": "/*\n * Globalize Culture ga\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.gd-GB.js",
    "chars": 1797,
    "preview": "/*\n * Globalize Culture gd-GB\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.gd.js",
    "chars": 1746,
    "preview": "/*\n * Globalize Culture gd\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.gl-ES.js",
    "chars": 1916,
    "preview": "/*\n * Globalize Culture gl-ES\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.gl.js",
    "chars": 1887,
    "preview": "/*\n * Globalize Culture gl\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.gsw-FR.js",
    "chars": 1888,
    "preview": "/*\n * Globalize Culture gsw-FR\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, In"
  },
  {
    "path": "test/libs/cultures/globalize.culture.gsw.js",
    "chars": 1857,
    "preview": "/*\n * Globalize Culture gsw\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n"
  },
  {
    "path": "test/libs/cultures/globalize.culture.gu-IN.js",
    "chars": 1787,
    "preview": "/*\n * Globalize Culture gu-IN\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.gu.js",
    "chars": 1763,
    "preview": "/*\n * Globalize Culture gu\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.ha-Latn-NG.js",
    "chars": 1529,
    "preview": "/*\n * Globalize Culture ha-Latn-NG\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy"
  },
  {
    "path": "test/libs/cultures/globalize.culture.ha-Latn.js",
    "chars": 1501,
    "preview": "/*\n * Globalize Culture ha-Latn\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, I"
  },
  {
    "path": "test/libs/cultures/globalize.culture.ha.js",
    "chars": 1473,
    "preview": "/*\n * Globalize Culture ha\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.he-IL.js",
    "chars": 2535,
    "preview": "/*\n * Globalize Culture he-IL\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.he.js",
    "chars": 2509,
    "preview": "/*\n * Globalize Culture he\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.hi-IN.js",
    "chars": 1751,
    "preview": "/*\n * Globalize Culture hi-IN\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.hi.js",
    "chars": 1727,
    "preview": "/*\n * Globalize Culture hi\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.hr-BA.js",
    "chars": 2015,
    "preview": "/*\n * Globalize Culture hr-BA\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.hr-HR.js",
    "chars": 2008,
    "preview": "/*\n * Globalize Culture hr-HR\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.hr.js",
    "chars": 1978,
    "preview": "/*\n * Globalize Culture hr\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.hsb-DE.js",
    "chars": 2174,
    "preview": "/*\n * Globalize Culture hsb-DE\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, In"
  },
  {
    "path": "test/libs/cultures/globalize.culture.hsb.js",
    "chars": 2146,
    "preview": "/*\n * Globalize Culture hsb\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n"
  },
  {
    "path": "test/libs/cultures/globalize.culture.hu-HU.js",
    "chars": 1910,
    "preview": "/*\n * Globalize Culture hu-HU\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.hu.js",
    "chars": 1876,
    "preview": "/*\n * Globalize Culture hu\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.hy-AM.js",
    "chars": 1606,
    "preview": "/*\n * Globalize Culture hy-AM\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.hy.js",
    "chars": 1576,
    "preview": "/*\n * Globalize Culture hy\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.id-ID.js",
    "chars": 1694,
    "preview": "/*\n * Globalize Culture id-ID\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.id.js",
    "chars": 1661,
    "preview": "/*\n * Globalize Culture id\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.ig-NG.js",
    "chars": 1550,
    "preview": "/*\n * Globalize Culture ig-NG\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.ig.js",
    "chars": 1521,
    "preview": "/*\n * Globalize Culture ig\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.ii-CN.js",
    "chars": 1760,
    "preview": "/*\n * Globalize Culture ii-CN\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.ii.js",
    "chars": 1735,
    "preview": "/*\n * Globalize Culture ii\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.is-IS.js",
    "chars": 1851,
    "preview": "/*\n * Globalize Culture is-IS\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.is.js",
    "chars": 1823,
    "preview": "/*\n * Globalize Culture is\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.it-CH.js",
    "chars": 1885,
    "preview": "/*\n * Globalize Culture it-CH\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.it-IT.js",
    "chars": 1895,
    "preview": "/*\n * Globalize Culture it-IT\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.it.js",
    "chars": 1869,
    "preview": "/*\n * Globalize Culture it\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.iu-Cans-CA.js",
    "chars": 1574,
    "preview": "/*\n * Globalize Culture iu-Cans-CA\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy"
  },
  {
    "path": "test/libs/cultures/globalize.culture.iu-Cans.js",
    "chars": 1550,
    "preview": "/*\n * Globalize Culture iu-Cans\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, I"
  },
  {
    "path": "test/libs/cultures/globalize.culture.iu-Latn-CA.js",
    "chars": 1554,
    "preview": "/*\n * Globalize Culture iu-Latn-CA\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy"
  },
  {
    "path": "test/libs/cultures/globalize.culture.iu-Latn.js",
    "chars": 1526,
    "preview": "/*\n * Globalize Culture iu-Latn\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, I"
  },
  {
    "path": "test/libs/cultures/globalize.culture.iu.js",
    "chars": 1498,
    "preview": "/*\n * Globalize Culture iu\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.ja-JP.js",
    "chars": 2532,
    "preview": "/*\n * Globalize Culture ja-JP\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.ja.js",
    "chars": 2510,
    "preview": "/*\n * Globalize Culture ja\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.ka-GE.js",
    "chars": 1795,
    "preview": "/*\n * Globalize Culture ka-GE\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.ka.js",
    "chars": 1763,
    "preview": "/*\n * Globalize Culture ka\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.kk-KZ.js",
    "chars": 1736,
    "preview": "/*\n * Globalize Culture kk-KZ\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.kk.js",
    "chars": 1702,
    "preview": "/*\n * Globalize Culture kk\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.kl-GL.js",
    "chars": 1907,
    "preview": "/*\n * Globalize Culture kl-GL\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.kl.js",
    "chars": 1867,
    "preview": "/*\n * Globalize Culture kl\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.km-KH.js",
    "chars": 2721,
    "preview": "/*\n * Globalize Culture km-KH\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.km.js",
    "chars": 2691,
    "preview": "/*\n * Globalize Culture km\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.kn-IN.js",
    "chars": 1775,
    "preview": "/*\n * Globalize Culture kn-IN\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.kn.js",
    "chars": 1751,
    "preview": "/*\n * Globalize Culture kn\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.ko-KR.js",
    "chars": 2377,
    "preview": "/*\n * Globalize Culture ko-KR\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc"
  },
  {
    "path": "test/libs/cultures/globalize.culture.ko.js",
    "chars": 2353,
    "preview": "/*\n * Globalize Culture ko\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n "
  },
  {
    "path": "test/libs/cultures/globalize.culture.kok-IN.js",
    "chars": 1757,
    "preview": "/*\n * Globalize Culture kok-IN\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, In"
  }
]

// ... and 175 more files (download for full content)

About this extraction

This page contains the full source code of the daffl/jquery.dform GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 375 files (1.9 MB), approximately 659.8k tokens, and a symbol index with 3 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!