{"html":"<div class=\"layout mod_form\"><form method=\"post\" enctype=\"multipart\/form-data\" action=\"\/basket\/api\/900\/submit-details\" data-fid=\"113\" data-session-data-check=\"\"><input type=\"hidden\" name=\"form-submitted\" value=\"true\" \/><input type=\"hidden\" name=\"cpid\" value=\"900\" \/><input type=\"hidden\" name=\"form-id\" value=\"113\" \/><div class=\"layout mod_form lid-113\" data-lid='113'> <div class=\"layout-cell i0 col1 istart\" data-cell-id='448'><div class=\"layout-cell i0 col1 left istart\" data-cell-id='450'><div class=\"layout-component col1 istart i0 textblock\" data-cid=\"924\" ><h2>Enter your Billing \/ Delivery Information<\/h2><\/div><\/div><div class=\"layout-cell i1 col1 left headed-cell margin-bottom-large\" data-cell-id='442'><label > Your details <\/label><div class=\"i\"><div class=\"layout-component required form-component col2 istart i0 text-field\" data-cid=\"901\" data-dependency-method='any' data-dependency='[]' data-dupid='0'><label class=\"\"> First Name <span class='ff-required-star'>*<\/span><\/label><input type=\"text\" placeholder=\"\" name=\"basket::guest-checkout::first-name\" aria-label=\"First Name\" tabindex=\"1\" data-input-filter=\"\" data-symbol=\"\" value=\"\" \/><\/div><div class=\"layout-component required form-component col2 iend i1 text-field\" data-cid=\"902\" data-dependency-method='any' data-dependency='[]' data-dupid='0'><label class=\"\"> Last Name <span class='ff-required-star'>*<\/span><\/label><input type=\"text\" placeholder=\"\" name=\"basket::guest-checkout::last-name\" aria-label=\"Last Name\" tabindex=\"2\" data-input-filter=\"\" data-symbol=\"\" value=\"\" \/><\/div><div class=\"layout-component required form-component col2 i2 email\" data-cid=\"903\" data-dependency-method='any' data-dependency='[]' data-dupid='0'><label class=\"\"> Email <span class='ff-required-star'>*<\/span><\/label><input type=\"text\" data-master=\"true\" tabindex=\"3\" placeholder=\"\" name=\"basket::guest-checkout::email\" value=\"\" aria-label=\"Email\" \/><\/div><div class=\"layout-component form-component col2 iend i3 text-field\" data-cid=\"904\" data-dependency-method='any' data-dependency='[]' data-dupid='0'><label class=\"\"> Telephone <\/label><input type=\"text\" placeholder=\"\" name=\"basket::guest-checkout::telephone\" aria-label=\"Telephone\" tabindex=\"4\" data-input-filter=\"\" data-symbol=\"\" value=\"\" \/><\/div><\/div><\/div><div class=\"layout-cell i2 col1 left iend headed-cell margin-bottom-large iend\" data-cell-id='443'><label > Billing \/ Delivery Address Details <\/label><div class=\"i\"><div class=\"layout-component required form-component col2 istart i0 text-field\" data-cid=\"905\" data-dependency-method='any' data-dependency='[]' data-dupid='0'><label class=\"\"> Line 1 <span class='ff-required-star'>*<\/span><\/label><input type=\"text\" placeholder=\"\" name=\"basket::guest-checkout::addr-line1\" aria-label=\"Line 1\" tabindex=\"5\" data-input-filter=\"\" data-symbol=\"\" value=\"\" \/><\/div><div class=\"layout-component form-component col2 iend i1 text-field\" data-cid=\"906\" data-dependency-method='any' data-dependency='[]' data-dupid='0'><label class=\"\"> Line 2 <\/label><input type=\"text\" placeholder=\"\" name=\"basket::guest-checkout::addr-line2\" aria-label=\"Line 2\" tabindex=\"6\" data-input-filter=\"\" data-symbol=\"\" value=\"\" \/><\/div><div class=\"layout-component required form-component col2 i2 text-field\" data-cid=\"907\" data-dependency-method='any' data-dependency='[]' data-dupid='0'><label class=\"\"> Town <span class='ff-required-star'>*<\/span><\/label><input type=\"text\" placeholder=\"\" name=\"basket::guest-checkout::town\" aria-label=\"Town\" tabindex=\"7\" data-input-filter=\"\" data-symbol=\"\" value=\"\" \/><\/div><div class=\"layout-component form-component col2 iend i3 text-field\" data-cid=\"908\" data-dependency-method='any' data-dependency='[]' data-dupid='0'><label class=\"\"> County <\/label><input type=\"text\" placeholder=\"\" name=\"basket::guest-checkout::county\" aria-label=\"County\" tabindex=\"8\" data-input-filter=\"\" data-symbol=\"\" value=\"\" \/><\/div><div class=\"layout-component required form-component col2 i4 text-field\" data-cid=\"909\" data-dependency-method='any' data-dependency='[]' data-dupid='0'><label class=\"\"> Post Code <span class='ff-required-star'>*<\/span><\/label><input type=\"text\" placeholder=\"\" name=\"basket::guest-checkout::postcode\" aria-label=\"Post Code\" tabindex=\"9\" data-input-filter=\"\" data-symbol=\"\" value=\"\" \/><\/div><div class=\"layout-component required complete form-component col2 iend iend i5 select\" data-cid=\"910\" data-dependency-method='any' data-dependency='[]' data-dupid='0'><label class=\"\"> Country <span class='ff-required-star'>*<\/span><\/label><select name=\"basket::guest-checkout::country\" tabindex=\"10\" aria-label=\"Country\" ><option value='' ><\/option><option value='8' >Afghanistan<\/option><option value='9' >Albania<\/option><option value='10' >Algeria<\/option><option value='11' >American Samoa<\/option><option value='12' >Andorra<\/option><option value='13' >Angola<\/option><option value='14' >Anguilla<\/option><option value='15' >Antarctica<\/option><option value='16' >Antigua and Barbuda<\/option><option value='17' >Argentina<\/option><option value='18' >Armenia<\/option><option value='19' >Aruba<\/option><option value='20' >Australia<\/option><option value='21' >Austria<\/option><option value='22' >Azerbaijan<\/option><option value='23' >Bahamas<\/option><option value='24' >Bahrain<\/option><option value='25' >Bangladesh<\/option><option value='26' >Barbados<\/option><option value='27' >Belarus<\/option><option value='28' >Belgium<\/option><option value='29' >Belize<\/option><option value='30' >Benin<\/option><option value='31' >Bermuda<\/option><option value='32' >Bhutan<\/option><option value='33' >Bolivia<\/option><option value='34' >Bosnia and Herzegovina<\/option><option value='35' >Botswana<\/option><option value='36' >Bouvet Island<\/option><option value='37' >Brazil<\/option><option value='38' >British Indian Ocean Territory<\/option><option value='39' >Brunei Darussalam<\/option><option value='40' >Bulgaria<\/option><option value='41' >Burkina Faso<\/option><option value='42' >Burundi<\/option><option value='43' >Cambodia<\/option><option value='44' >Cameroon<\/option><option value='45' >Canada<\/option><option value='46' >Cape Verde<\/option><option value='47' >Cayman Islands<\/option><option value='48' >Central African Republic<\/option><option value='49' >Chad<\/option><option value='261' >Channel Islands<\/option><option value='50' >Chile<\/option><option value='51' >China<\/option><option value='52' >Christmas Island<\/option><option value='53' >Cocos (Keeling) Islands<\/option><option value='54' >Colombia<\/option><option value='55' >Comoros<\/option><option value='56' >Congo<\/option><option value='57' >Congo, the Democratic Republic of the<\/option><option value='58' >Cook Islands<\/option><option value='59' >Costa Rica<\/option><option value='60' >Cote D&#039;Ivoire<\/option><option value='61' >Croatia<\/option><option value='62' >Cuba<\/option><option value='63' >Cyprus<\/option><option value='64' >Czech Republic<\/option><option value='65' >Denmark<\/option><option value='66' >Djibouti<\/option><option value='67' >Dominica<\/option><option value='68' >Dominican Republic<\/option><option value='69' >Ecuador<\/option><option value='70' >Egypt<\/option><option value='71' >El Salvador<\/option><option value='72' >Equatorial Guinea<\/option><option value='73' >Eritrea<\/option><option value='74' >Estonia<\/option><option value='75' >Ethiopia<\/option><option value='76' >Falkland Islands (Malvinas)<\/option><option value='77' >Faroe Islands<\/option><option value='78' >Fiji<\/option><option value='79' >Finland<\/option><option value='80' >France<\/option><option value='82' >French Polynesia<\/option><option value='81' >French Guiana<\/option><option value='83' >French Southern Territories<\/option><option value='84' >Gabon<\/option><option value='85' >Gambia<\/option><option value='86' >Georgia<\/option><option value='87' >Germany<\/option><option value='88' >Ghana<\/option><option value='89' >Gibraltar<\/option><option value='90' >Greece<\/option><option value='91' >Greenland<\/option><option value='92' >Grenada<\/option><option value='93' >Guadeloupe<\/option><option value='94' >Guam<\/option><option value='95' >Guatemala<\/option><option value='96' >Guinea<\/option><option value='97' >Guinea-Bissau<\/option><option value='98' >Guyana<\/option><option value='99' >Haiti<\/option><option value='100' >Heard Island and Mcdonald Islands<\/option><option value='250' >Highlands<\/option><option value='101' >Holy See (Vatican City State)<\/option><option value='102' >Honduras<\/option><option value='103' >Hong Kong<\/option><option value='104' >Hungary<\/option><option value='105' >Iceland<\/option><option value='106' >India<\/option><option value='107' >Indonesia<\/option><option value='108' >Iran, Islamic Republic of<\/option><option value='109' >Iraq<\/option><option value='110' >Ireland<\/option><option value='260' >Isle of Man<\/option><option value='111' >Israel<\/option><option value='112' >Italy<\/option><option value='113' >Jamaica<\/option><option value='114' >Japan<\/option><option value='115' >Jordan<\/option><option value='116' >Kazakhstan<\/option><option value='117' >Kenya<\/option><option value='118' >Kiribati<\/option><option value='119' >Korea, Democratic People&#039;s Republic of<\/option><option value='120' >Korea, Republic of<\/option><option value='121' >Kuwait<\/option><option value='122' >Kyrgyzstan<\/option><option value='123' >Lao People&#039;s Democratic Republic<\/option><option value='124' >Latvia<\/option><option value='125' >Lebanon<\/option><option value='126' >Lesotho<\/option><option value='127' >Liberia<\/option><option value='128' >Libyan Arab Jamahiriya<\/option><option value='129' >Liechtenstein<\/option><option value='130' >Lithuania<\/option><option value='131' >Luxembourg<\/option><option value='132' >Macao<\/option><option value='133' >Macedonia<\/option><option value='134' >Madagascar<\/option><option value='135' >Malawi<\/option><option value='136' >Malaysia<\/option><option value='137' >Maldives<\/option><option value='138' >Mali<\/option><option value='139' >Malta<\/option><option value='140' >Marshall Islands<\/option><option value='141' >Martinique<\/option><option value='142' >Mauritania<\/option><option value='143' >Mauritius<\/option><option value='144' >Mayotte<\/option><option value='145' >Mexico<\/option><option value='146' >Micronesia, Federated States of<\/option><option value='147' >Moldova, Republic of<\/option><option value='148' >Monaco<\/option><option value='149' >Mongolia<\/option><option value='248' >Montenegro<\/option><option value='150' >Montserrat<\/option><option value='151' >Morocco<\/option><option value='152' >Mozambique<\/option><option value='153' >Myanmar<\/option><option value='154' >Namibia<\/option><option value='155' >Nauru<\/option><option value='156' >Nepal<\/option><option value='157' >Netherlands<\/option><option value='158' >Netherlands Antilles<\/option><option value='160' >New Zealand<\/option><option value='159' >New Caledonia<\/option><option value='161' >Nicaragua<\/option><option value='162' >Niger<\/option><option value='163' >Nigeria<\/option><option value='164' >Niue<\/option><option value='165' >Norfolk Island<\/option><option value='254' >Northern Ireland<\/option><option value='166' >Northern Mariana Islands<\/option><option value='167' >Norway<\/option><option value='168' >Oman<\/option><option value='169' >Pakistan<\/option><option value='170' >Palau<\/option><option value='171' >Palestinian Territory, Occupied<\/option><option value='172' >Panama<\/option><option value='173' >Papua New Guinea<\/option><option value='174' >Paraguay<\/option><option value='175' >Peru<\/option><option value='176' >Philippines<\/option><option value='177' >Pitcairn<\/option><option value='178' >Poland<\/option><option value='179' >Portugal<\/option><option value='180' >Puerto Rico<\/option><option value='181' >Qatar<\/option><option value='182' >Reunion<\/option><option value='183' >Romania<\/option><option value='184' >Russian Federation<\/option><option value='185' >Rwanda<\/option><option value='186' >Saint Helena<\/option><option value='187' >Saint Kitts and Nevis<\/option><option value='188' >Saint Lucia<\/option><option value='189' >Saint Pierre and Miquelon<\/option><option value='190' >Saint Vincent and the Grenadines<\/option><option value='191' >Samoa<\/option><option value='192' >San Marino<\/option><option value='193' >Sao Tome and Principe<\/option><option value='194' >Saudi Arabia<\/option><option value='263' >Scilly Isles <\/option><option value='249' >Scotland<\/option><option value='251' >Scottish Highlands<\/option><option value='262' >Scottish Islands<\/option><option value='195' >Senegal<\/option><option value='247' >Serbia<\/option><option value='197' >Seychelles<\/option><option value='198' >Sierra Leone<\/option><option value='199' >Singapore<\/option><option value='200' >Slovakia<\/option><option value='201' >Slovenia<\/option><option value='202' >Solomon Islands<\/option><option value='203' >Somalia<\/option><option value='204' >South Africa<\/option><option value='205' >South Georgia<\/option><option value='206' >Spain<\/option><option value='207' >Sri Lanka<\/option><option value='208' >Sudan<\/option><option value='209' >Suriname<\/option><option value='210' >Svalbard and Jan Mayen<\/option><option value='211' >Swaziland<\/option><option value='212' >Sweden<\/option><option value='213' >Switzerland<\/option><option value='214' >Syrian Arab Republic<\/option><option value='215' >Taiwan, Province of China<\/option><option value='216' >Tajikistan<\/option><option value='217' >Tanzania, United Republic of<\/option><option value='218' >Thailand<\/option><option value='219' >Timor-Leste<\/option><option value='220' >Togo<\/option><option value='221' >Tokelau<\/option><option value='222' >Tonga<\/option><option value='223' >Trinidad and Tobago<\/option><option value='224' >Tunisia<\/option><option value='225' >Turkey<\/option><option value='226' >Turkmenistan<\/option><option value='227' >Turks and Caicos Islands<\/option><option value='228' >Tuvalu<\/option><option value='229' >Uganda<\/option><option value='230' >Ukraine<\/option><option value='233' >United States<\/option><option value='231' >United Arab Emirates<\/option><option selected='selected' value='232' >United Kingdom<\/option><option value='234' >United States Minor Outlying Islands<\/option><option value='235' >Uruguay<\/option><option value='236' >Uzbekistan<\/option><option value='237' >Vanuatu<\/option><option value='238' >Venezuela<\/option><option value='239' >Viet Nam<\/option><option value='241' >Virgin Islands, U.s.<\/option><option value='240' >Virgin Islands, British<\/option><option value='242' >Wallis and Futuna<\/option><option value='243' >Western Sahara<\/option><option value='244' >Yemen<\/option><option value='245' >Zambia<\/option><option value='246' >Zimbabwe<\/option><\/select><\/div><\/div><\/div><\/div><div class=\"layout-cell i1 col1 margin-bottom-large\" data-cell-id='449'><div class=\"layout-component form-component col1 istart i0 checkbox\" data-cid=\"911\" data-dependency-method='any' data-dependency='[]' data-dupid='0' data-max-selected='0'> <div class=\"multi-select-container hint checkbox-value\" title=\"\"><input type=\"checkbox\" name=\"basket::guest-checkout::alt-address[cb-5f3a9a12a9dd2]\" value=\"Use Alternative Delivery Address\" aria-label=\"Use Alternative Delivery Address\" tabindex=\"11\" class=\"\" \/><label class=\"checkbox-label multi-select-label\">Use Alternative Delivery Address<\/label> <\/div><\/div><\/div><div class=\"layout-cell i2 col1\" data-cell-id='444'><div class=\"layout-cell i0 col1 left headed-cell margin-bottom-large istart\" data-cell-id='445'><label > Alternate Delivery Information <\/label><div class=\"i\"><div class=\"layout-component form-component col2 istart i0 text-field\" data-cid=\"912\" data-dependency-method='any' data-dependency='[{&quot;cid&quot;:&quot;911&quot;,&quot;method&quot;:&quot;and&quot;,&quot;values&quot;:[&quot;Use Alternative Delivery Address&quot;]}]' data-dupid='0'><label class=\"\"> First Name <\/label><input type=\"text\" placeholder=\"\" name=\"basket::guest-checkout::alt-delivery::first-name\" aria-label=\"First Name\" tabindex=\"12\" data-input-filter=\"\" data-symbol=\"\" value=\"\" \/><\/div><div class=\"layout-component form-component col2 iend i1 text-field\" data-cid=\"913\" data-dependency-method='any' data-dependency='[{&quot;cid&quot;:&quot;911&quot;,&quot;method&quot;:&quot;and&quot;,&quot;values&quot;:[&quot;Use Alternative Delivery Address&quot;]}]' data-dupid='0'><label class=\"\"> Last Name <\/label><input type=\"text\" placeholder=\"\" name=\"basket::guest-checkout::alt-delivery::last-name\" aria-label=\"Last Name\" tabindex=\"13\" data-input-filter=\"\" data-symbol=\"\" value=\"\" \/><\/div><div class=\"layout-component form-component col2 i2 text-field\" data-cid=\"914\" data-dependency-method='any' data-dependency='[{&quot;cid&quot;:&quot;911&quot;,&quot;method&quot;:&quot;and&quot;,&quot;values&quot;:[&quot;Use Alternative Delivery Address&quot;]}]' data-dupid='0'><label class=\"\"> Email <\/label><input type=\"text\" placeholder=\"\" name=\"basket::guest-checkout::alt-delivery::email\" aria-label=\"Email\" tabindex=\"14\" data-input-filter=\"\" data-symbol=\"\" value=\"\" \/><\/div><div class=\"layout-component form-component col2 iend i3 text-field\" data-cid=\"915\" data-dependency-method='any' data-dependency='[{&quot;cid&quot;:&quot;911&quot;,&quot;method&quot;:&quot;and&quot;,&quot;values&quot;:[&quot;Use Alternative Delivery Address&quot;]}]' data-dupid='0'><label class=\"\"> Telephone <\/label><input type=\"text\" placeholder=\"\" name=\"basket::guest-checkout::alt-delivery::telephone\" aria-label=\"Telephone\" tabindex=\"15\" data-input-filter=\"\" data-symbol=\"\" value=\"\" \/><\/div><\/div><\/div><div class=\"layout-cell i1 col1 left headed-cell margin-bottom-large iend\" data-cell-id='446'><label > Alternate Delivery Address <\/label><div class=\"i\"><div class=\"layout-component form-component col2 istart i0 text-field\" data-cid=\"916\" data-dependency-method='any' data-dependency='[{&quot;cid&quot;:&quot;911&quot;,&quot;method&quot;:&quot;and&quot;,&quot;values&quot;:[&quot;Use Alternative Delivery Address&quot;]}]' data-dupid='0'><label class=\"\"> Line 1 <\/label><input type=\"text\" placeholder=\"\" name=\"basket::guest-checkout::alt-delivery::addr-line1\" aria-label=\"Line 1\" tabindex=\"16\" data-input-filter=\"\" data-symbol=\"\" value=\"\" \/><\/div><div class=\"layout-component form-component col2 iend i1 text-field\" data-cid=\"917\" data-dependency-method='any' data-dependency='[{&quot;cid&quot;:&quot;911&quot;,&quot;method&quot;:&quot;and&quot;,&quot;values&quot;:[&quot;Use Alternative Delivery Address&quot;]}]' data-dupid='0'><label class=\"\"> Line 2 <\/label><input type=\"text\" placeholder=\"\" name=\"basket::guest-checkout::alt-delivery::addr-line2\" aria-label=\"Line 2\" tabindex=\"17\" data-input-filter=\"\" data-symbol=\"\" value=\"\" \/><\/div><div class=\"layout-component form-component col2 i2 text-field\" data-cid=\"918\" data-dependency-method='any' data-dependency='[{&quot;cid&quot;:&quot;911&quot;,&quot;method&quot;:&quot;and&quot;,&quot;values&quot;:[&quot;Use Alternative Delivery Address&quot;]}]' data-dupid='0'><label class=\"\"> Town <\/label><input type=\"text\" placeholder=\"\" name=\"basket::guest-checkout::alt-delivery::town\" aria-label=\"Town\" tabindex=\"18\" data-input-filter=\"\" data-symbol=\"\" value=\"\" \/><\/div><div class=\"layout-component form-component col2 iend i3 text-field\" data-cid=\"919\" data-dependency-method='any' data-dependency='[{&quot;cid&quot;:&quot;911&quot;,&quot;method&quot;:&quot;and&quot;,&quot;values&quot;:[&quot;Use Alternative Delivery Address&quot;]}]' data-dupid='0'><label class=\"\"> County <\/label><input type=\"text\" placeholder=\"\" name=\"basket::guest-checkout::alt-delivery::county\" aria-label=\"County\" tabindex=\"19\" data-input-filter=\"\" data-symbol=\"\" value=\"\" \/><\/div><div class=\"layout-component form-component col2 i4 text-field\" data-cid=\"920\" data-dependency-method='any' data-dependency='[{&quot;cid&quot;:&quot;911&quot;,&quot;method&quot;:&quot;and&quot;,&quot;values&quot;:[&quot;Use Alternative Delivery Address&quot;]}]' data-dupid='0'><label class=\"\"> Postcode <\/label><input type=\"text\" placeholder=\"\" name=\"basket::guest-checkout::alt-delivery::postcode\" aria-label=\"Postcode\" tabindex=\"20\" data-input-filter=\"\" data-symbol=\"\" value=\"\" \/><\/div><div class=\"layout-component complete form-component col2 iend iend i5 select\" data-cid=\"921\" data-dependency-method='any' data-dependency='[{&quot;cid&quot;:&quot;911&quot;,&quot;method&quot;:&quot;and&quot;,&quot;values&quot;:[&quot;Use Alternative Delivery Address&quot;]}]' data-dupid='0'><label class=\"\"> Country <\/label><select name=\"basket::guest-checkout::alt-delivery::country\" tabindex=\"21\" aria-label=\"Country\" ><option value='' >--please select--<\/option><option value='8' >Afghanistan<\/option><option value='9' >Albania<\/option><option value='10' >Algeria<\/option><option value='11' >American Samoa<\/option><option value='12' >Andorra<\/option><option value='13' >Angola<\/option><option value='14' >Anguilla<\/option><option value='15' >Antarctica<\/option><option value='16' >Antigua and Barbuda<\/option><option value='17' >Argentina<\/option><option value='18' >Armenia<\/option><option value='19' >Aruba<\/option><option value='20' >Australia<\/option><option value='21' >Austria<\/option><option value='22' >Azerbaijan<\/option><option value='23' >Bahamas<\/option><option value='24' >Bahrain<\/option><option value='25' >Bangladesh<\/option><option value='26' >Barbados<\/option><option value='27' >Belarus<\/option><option value='28' >Belgium<\/option><option value='29' >Belize<\/option><option value='30' >Benin<\/option><option value='31' >Bermuda<\/option><option value='32' >Bhutan<\/option><option value='33' >Bolivia<\/option><option value='34' >Bosnia and Herzegovina<\/option><option value='35' >Botswana<\/option><option value='36' >Bouvet Island<\/option><option value='37' >Brazil<\/option><option value='38' >British Indian Ocean Territory<\/option><option value='39' >Brunei Darussalam<\/option><option value='40' >Bulgaria<\/option><option value='41' >Burkina Faso<\/option><option value='42' >Burundi<\/option><option value='43' >Cambodia<\/option><option value='44' >Cameroon<\/option><option value='45' >Canada<\/option><option value='46' >Cape Verde<\/option><option value='47' >Cayman Islands<\/option><option value='48' >Central African Republic<\/option><option value='49' >Chad<\/option><option value='261' >Channel Islands<\/option><option value='50' >Chile<\/option><option value='51' >China<\/option><option value='52' >Christmas Island<\/option><option value='53' >Cocos (Keeling) Islands<\/option><option value='54' >Colombia<\/option><option value='55' >Comoros<\/option><option value='56' >Congo<\/option><option value='57' >Congo, the Democratic Republic of the<\/option><option value='58' >Cook Islands<\/option><option value='59' >Costa Rica<\/option><option value='60' >Cote D&#039;Ivoire<\/option><option value='61' >Croatia<\/option><option value='62' >Cuba<\/option><option value='63' >Cyprus<\/option><option value='64' >Czech Republic<\/option><option value='65' >Denmark<\/option><option value='66' >Djibouti<\/option><option value='67' >Dominica<\/option><option value='68' >Dominican Republic<\/option><option value='69' >Ecuador<\/option><option value='70' >Egypt<\/option><option value='71' >El Salvador<\/option><option value='72' >Equatorial Guinea<\/option><option value='73' >Eritrea<\/option><option value='74' >Estonia<\/option><option value='75' >Ethiopia<\/option><option value='76' >Falkland Islands (Malvinas)<\/option><option value='77' >Faroe Islands<\/option><option value='78' >Fiji<\/option><option value='79' >Finland<\/option><option value='80' >France<\/option><option value='82' >French Polynesia<\/option><option value='81' >French Guiana<\/option><option value='83' >French Southern Territories<\/option><option value='84' >Gabon<\/option><option value='85' >Gambia<\/option><option value='86' >Georgia<\/option><option value='87' >Germany<\/option><option value='88' >Ghana<\/option><option value='89' >Gibraltar<\/option><option value='90' >Greece<\/option><option value='91' >Greenland<\/option><option value='92' >Grenada<\/option><option value='93' >Guadeloupe<\/option><option value='94' >Guam<\/option><option value='95' >Guatemala<\/option><option value='96' >Guinea<\/option><option value='97' >Guinea-Bissau<\/option><option value='98' >Guyana<\/option><option value='99' >Haiti<\/option><option value='100' >Heard Island and Mcdonald Islands<\/option><option value='250' >Highlands<\/option><option value='101' >Holy See (Vatican City State)<\/option><option value='102' >Honduras<\/option><option value='103' >Hong Kong<\/option><option value='104' >Hungary<\/option><option value='105' >Iceland<\/option><option value='106' >India<\/option><option value='107' >Indonesia<\/option><option value='108' >Iran, Islamic Republic of<\/option><option value='109' >Iraq<\/option><option value='110' >Ireland<\/option><option value='260' >Isle of Man<\/option><option value='111' >Israel<\/option><option value='112' >Italy<\/option><option value='113' >Jamaica<\/option><option value='114' >Japan<\/option><option value='115' >Jordan<\/option><option value='116' >Kazakhstan<\/option><option value='117' >Kenya<\/option><option value='118' >Kiribati<\/option><option value='119' >Korea, Democratic People&#039;s Republic of<\/option><option value='120' >Korea, Republic of<\/option><option value='121' >Kuwait<\/option><option value='122' >Kyrgyzstan<\/option><option value='123' >Lao People&#039;s Democratic Republic<\/option><option value='124' >Latvia<\/option><option value='125' >Lebanon<\/option><option value='126' >Lesotho<\/option><option value='127' >Liberia<\/option><option value='128' >Libyan Arab Jamahiriya<\/option><option value='129' >Liechtenstein<\/option><option value='130' >Lithuania<\/option><option value='131' >Luxembourg<\/option><option value='132' >Macao<\/option><option value='133' >Macedonia<\/option><option value='134' >Madagascar<\/option><option value='135' >Malawi<\/option><option value='136' >Malaysia<\/option><option value='137' >Maldives<\/option><option value='138' >Mali<\/option><option value='139' >Malta<\/option><option value='140' >Marshall Islands<\/option><option value='141' >Martinique<\/option><option value='142' >Mauritania<\/option><option value='143' >Mauritius<\/option><option value='144' >Mayotte<\/option><option value='145' >Mexico<\/option><option value='146' >Micronesia, Federated States of<\/option><option value='147' >Moldova, Republic of<\/option><option value='148' >Monaco<\/option><option value='149' >Mongolia<\/option><option value='248' >Montenegro<\/option><option value='150' >Montserrat<\/option><option value='151' >Morocco<\/option><option value='152' >Mozambique<\/option><option value='153' >Myanmar<\/option><option value='154' >Namibia<\/option><option value='155' >Nauru<\/option><option value='156' >Nepal<\/option><option value='157' >Netherlands<\/option><option value='158' >Netherlands Antilles<\/option><option value='160' >New Zealand<\/option><option value='159' >New Caledonia<\/option><option value='161' >Nicaragua<\/option><option value='162' >Niger<\/option><option value='163' >Nigeria<\/option><option value='164' >Niue<\/option><option value='165' >Norfolk Island<\/option><option value='254' >Northern Ireland<\/option><option value='166' >Northern Mariana Islands<\/option><option value='167' >Norway<\/option><option value='168' >Oman<\/option><option value='169' >Pakistan<\/option><option value='170' >Palau<\/option><option value='171' >Palestinian Territory, Occupied<\/option><option value='172' >Panama<\/option><option value='173' >Papua New Guinea<\/option><option value='174' >Paraguay<\/option><option value='175' >Peru<\/option><option value='176' >Philippines<\/option><option value='177' >Pitcairn<\/option><option value='178' >Poland<\/option><option value='179' >Portugal<\/option><option value='180' >Puerto Rico<\/option><option value='181' >Qatar<\/option><option value='182' >Reunion<\/option><option value='183' >Romania<\/option><option value='184' >Russian Federation<\/option><option value='185' >Rwanda<\/option><option value='186' >Saint Helena<\/option><option value='187' >Saint Kitts and Nevis<\/option><option value='188' >Saint Lucia<\/option><option value='189' >Saint Pierre and Miquelon<\/option><option value='190' >Saint Vincent and the Grenadines<\/option><option value='191' >Samoa<\/option><option value='192' >San Marino<\/option><option value='193' >Sao Tome and Principe<\/option><option value='194' >Saudi Arabia<\/option><option value='263' >Scilly Isles <\/option><option value='249' >Scotland<\/option><option value='251' >Scottish Highlands<\/option><option value='262' >Scottish Islands<\/option><option value='195' >Senegal<\/option><option value='247' >Serbia<\/option><option value='197' >Seychelles<\/option><option value='198' >Sierra Leone<\/option><option value='199' >Singapore<\/option><option value='200' >Slovakia<\/option><option value='201' >Slovenia<\/option><option value='202' >Solomon Islands<\/option><option value='203' >Somalia<\/option><option value='204' >South Africa<\/option><option value='205' >South Georgia<\/option><option value='206' >Spain<\/option><option value='207' >Sri Lanka<\/option><option value='208' >Sudan<\/option><option value='209' >Suriname<\/option><option value='210' >Svalbard and Jan Mayen<\/option><option value='211' >Swaziland<\/option><option value='212' >Sweden<\/option><option value='213' >Switzerland<\/option><option value='214' >Syrian Arab Republic<\/option><option value='215' >Taiwan, Province of China<\/option><option value='216' >Tajikistan<\/option><option value='217' >Tanzania, United Republic of<\/option><option value='218' >Thailand<\/option><option value='219' >Timor-Leste<\/option><option value='220' >Togo<\/option><option value='221' >Tokelau<\/option><option value='222' >Tonga<\/option><option value='223' >Trinidad and Tobago<\/option><option value='224' >Tunisia<\/option><option value='225' >Turkey<\/option><option value='226' >Turkmenistan<\/option><option value='227' >Turks and Caicos Islands<\/option><option value='228' >Tuvalu<\/option><option value='229' >Uganda<\/option><option value='230' >Ukraine<\/option><option value='233' >United States<\/option><option value='231' >United Arab Emirates<\/option><option selected='selected' value='232' >United Kingdom<\/option><option value='234' >United States Minor Outlying Islands<\/option><option value='235' >Uruguay<\/option><option value='236' >Uzbekistan<\/option><option value='237' >Vanuatu<\/option><option value='238' >Venezuela<\/option><option value='239' >Viet Nam<\/option><option value='241' >Virgin Islands, U.s.<\/option><option value='240' >Virgin Islands, British<\/option><option value='242' >Wallis and Futuna<\/option><option value='243' >Western Sahara<\/option><option value='244' >Yemen<\/option><option value='245' >Zambia<\/option><option value='246' >Zimbabwe<\/option><\/select><\/div><\/div><\/div><\/div><div class=\"layout-cell i3 col1 iend\" data-cell-id='447'><div class=\"layout-component form-component col1 istart i0 submit-button\" data-cid=\"922\" data-dependency-method='any' data-dependency='[]' data-dupid='0'><input class=\"go large\" type=\"submit\" value=\"Submit\" tabindex=\"22\" \/><\/div><div class=\"layout-component form-component col1 iend i1 main-config empty\" data-cid=\"923\" data-ajax='true'> &nbsp; <\/div><\/div><\/div><\/form><\/div>","js":"\n\n\/*******\n\/include\/script\/core\/base64-image.js\n*********\/\n(function () {\n    $.fn.base64image = function (options) {\n\n        var container = $(this);\n\n        options = $.extend({\n            input: $(this).find(\".image-data\"),\n            preview: $(this).find(\"img\"),\n            pdfpreview: $(this).find(\".pdf-preview\"),\n            fninput: $(this).find(\".fn\"),\n            onchange: function (fn, data) {},\n            ondelete: function () {}\n        }, options);\n\n        $(this).find(\".button.delete,.delete-image\").on(\"click\", function (e) {\n            e.preventDefault();\n            container.find(\"img\").attr(\"src\", \"\");\n            container.find(\".delete-image\").val(1);\n            container.find(\".image-deleted\").val(1);\n            options.ondelete();\n        });\n\n        $(this).find(\"input[type='file']\").off(\"change\").on(\"change\", function (e, ep) {\n\n            var files = this.files;\n            if (typeof files !== \"undefined\") {\n                (function () {\n                    var num_files = files.length;\n\n                    if (!num_files) {\n                        alert(\"No Files Selected\");\n                        return;\n                    }\n\n                    var reader = new FileReader();\n                    reader.readAsDataURL(files[0]);\n                    var fn = files[0].name;\n\n                    reader.onload = function (e) {\n                        options.fninput.val(fn);\n                        if (files[0].type === \"application\/pdf\") {\n                            options.pdfpreview.removeClass(\"hidden\");\n                            const src = URL.createObjectURL(files[0]);\n                            options.pdfpreview.attr(\"src\", src);\n                        } else {\n                            options.preview.attr(\"src\", e.target.result);\n                        }\n                        options.input.val(e.target.result);\n                        options.onchange(fn, e.target.result);\n                    };\n                })();\n            } else {\n                alert(\"No support for the File API in this web browser\");\n            }\n        });\n\n        return $(this);\n    };\n})(jQuery);\n\n$(document).ready(function () {\n    $(\".image-input:not(.base64-initialised)\").each(function () {\n        $(this).addClass(\"base64-initialised\");\n        $(this).base64image({\n            input: $(this).find(\".image-data\")\n        });\n    });\n});\n\n\/*******\n\/include\/script\/jquery\/jquery.touch.js\n*********\/\n\/*!\n * jQuery UI Touch Punch 0.2.3\n *\n * Copyright 2011\u20132014, Dave Furfero\n * Dual licensed under the MIT or GPL Version 2 licenses.\n *\n * Depends:\n *  jquery.ui.widget.js\n *  jquery.ui.mouse.js\n *  \n *  further modified to use .on instead of 'bind' by Watman & Worth Web Ltd\n *  \n *\/\n\n(function ($) {\n\n  \/\/ Detect touch support\n  $.support.touch = 'ontouchend' in document;\n\n  \/\/ Ignore browsers without touch support\n  if (!$.support.touch) {\n    return;\n  }\n\n  var mouseProto = $.ui.mouse.prototype,\n      _mouseInit = mouseProto._mouseInit,\n      _mouseDestroy = mouseProto._mouseDestroy,\n      touchHandled;\n\n  \/**\n   * Simulate a mouse event based on a corresponding touch event\n   * @param {Object} event A touch event\n   * @param {String} simulatedType The corresponding mouse event\n   *\/\n  function simulateMouseEvent (event, simulatedType) {\n\n    \/\/ Ignore multi-touch events\n    if (event.originalEvent.touches.length > 1) {\n      return;\n    }\n\n    event.preventDefault();\n\n    var touch = event.originalEvent.changedTouches[0],\n        simulatedEvent = document.createEvent('MouseEvents');\n    \n    \/\/ Initialize the simulated mouse event using the touch event's coordinates\n    simulatedEvent.initMouseEvent(\n      simulatedType,    \/\/ type\n      true,             \/\/ bubbles                    \n      true,             \/\/ cancelable                 \n      window,           \/\/ view                       \n      1,                \/\/ detail                     \n      touch.screenX,    \/\/ screenX                    \n      touch.screenY,    \/\/ screenY                    \n      touch.clientX,    \/\/ clientX                    \n      touch.clientY,    \/\/ clientY                    \n      false,            \/\/ ctrlKey                    \n      false,            \/\/ altKey                     \n      false,            \/\/ shiftKey                   \n      false,            \/\/ metaKey                    \n      0,                \/\/ button                     \n      null              \/\/ relatedTarget              \n    );\n\n    \/\/ Dispatch the simulated event to the target element\n    event.target.dispatchEvent(simulatedEvent);\n  }\n\n  \/**\n   * Handle the jQuery UI widget's touchstart events\n   * @param {Object} event The widget element's touchstart event\n   *\/\n  mouseProto._touchStart = function (event) {\n\n    var self = this;\n\n    \/\/ Ignore the event if another widget is already being handled\n    if (touchHandled || !self._mouseCapture(event.originalEvent.changedTouches[0])) {\n      return;\n    }\n\n    \/\/ Set the flag to prevent other widgets from inheriting the touch event\n    touchHandled = true;\n\n    \/\/ Track movement to determine if interaction was a click\n    self._touchMoved = false;\n\n    \/\/ Simulate the mouseover event\n    simulateMouseEvent(event, 'mouseover');\n\n    \/\/ Simulate the mousemove event\n    simulateMouseEvent(event, 'mousemove');\n\n    \/\/ Simulate the mousedown event\n    simulateMouseEvent(event, 'mousedown');\n  };\n\n  \/**\n   * Handle the jQuery UI widget's touchmove events\n   * @param {Object} event The document's touchmove event\n   *\/\n  mouseProto._touchMove = function (event) {\n\n    \/\/ Ignore event if not handled\n    if (!touchHandled) {\n      return;\n    }\n\n    \/\/ Interaction was not a click\n    this._touchMoved = true;\n\n    \/\/ Simulate the mousemove event\n    simulateMouseEvent(event, 'mousemove');\n  };\n\n  \/**\n   * Handle the jQuery UI widget's touchend events\n   * @param {Object} event The document's touchend event\n   *\/\n  mouseProto._touchEnd = function (event) {\n\n    \/\/ Ignore event if not handled\n    if (!touchHandled) {\n      return;\n    }\n\n    \/\/ Simulate the mouseup event\n    simulateMouseEvent(event, 'mouseup');\n\n    \/\/ Simulate the mouseout event\n    simulateMouseEvent(event, 'mouseout');\n\n    \/\/ If the touch interaction did not move, it should trigger a click\n    if (!this._touchMoved) {\n\n      \/\/ Simulate the click event\n      simulateMouseEvent(event, 'click');\n    }\n\n    \/\/ Unset the flag to allow other widgets to inherit the touch event\n    touchHandled = false;\n  };\n\n  \/**\n   * A duck punch of the $.ui.mouse _mouseInit method to support touch events.\n   * This method extends the widget with bound touch event handlers that\n   * translate touch events to mouse events and pass them to the widget's\n   * original mouse event handling methods.\n   *\/\n  mouseProto._mouseInit = function () {\n    \n    var self = this;\n\n    \/\/ Delegate the touch handlers to the widget's element\n    self.element.on({\n      touchstart: $.proxy(self, '_touchStart'),\n      touchmove: $.proxy(self, '_touchMove'),\n      touchend: $.proxy(self, '_touchEnd')\n    });\n\n    \/\/ Call the original $.ui.mouse init method\n    _mouseInit.call(self);\n  };\n\n  \/**\n   * Remove the touch event handlers\n   *\/\n  mouseProto._mouseDestroy = function () {\n    \n    var self = this;\n\n    \/\/ Delegate the touch handlers to the widget's element\n    self.element.on({\n      touchstart: $.proxy(self, '_touchStart'),\n      touchmove: $.proxy(self, '_touchMove'),\n      touchend: $.proxy(self, '_touchEnd')\n    });\n\n    \/\/ Call the original $.ui.mouse destroy method\n    _mouseDestroy.call(self);\n  };\n\n})(jQuery);\n\n\/*******\n\/include\/script\/eos.js\n*********\/\nvar eosglobalconfig = {};\n\n$(document).ready(function () {\n\n    var ld = $(\"#eos-global-config\");\n    try {\n        var data = $.parseJSON(ld.text());\n        if (data.eosglobalconfig) {\n            eosglobalconfig = data.eosglobalconfig;\n            return false;\n        }\n    } catch (e) {\n    }\n\n    $(\"a\").on(\"click\", function () {\n        $(this).addClass(\"clicked\");\n    });\n\n    $(\"a\").each(function () {\n        if (this.href.indexOf(\"userfiles\") !== -1) {\n            $(this).attr(\"download\", \"\");\n            $(this).addClass(\"download\");\n        }\n    });\n\n    var ignore_onbeforeunload = false;\n    $('a[href^=mailto],.download,.telephone').on('click', function () {\/\/chrome work around, as the daft thing triggers beforeunload when mailto links are clicked..\n        ignore_onbeforeunload = true;\n    });\n\n    $(window).on(\"beforeunload pagehide\", function (e) {\n\n        if (ignore_onbeforeunload) {\n            ignore_onbeforeunload = false;\n            return;\n        }\n\n        setTimeout(function () {\n            if ($(\".clicked-spinner\").length) {\n                $(\".clicked-spinner\").removeClass(\"hidden\");\n                $(\"body\").addClass(\"clicked-and-loading\");\n            }\n        }, 750);\n\n    });\n\n});\n\n(function ($) {\n    $.extend({\n        get_parameter: function (name) {\n            name = name.replace(\/[\\[\\]]\/g, '\\\\$&');\n            var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),\n                    results = regex.exec(window.location.href);\n            if (!results)\n                return null;\n            if (!results[2])\n                return '';\n            return decodeURIComponent(results[2].replace(\/\\+\/g, ' '));\n        }\n    });\n\n    $.extend({\n        get_todays_date: function () {\n            var now = new Date();\n            var day = (\"0\" + now.getDate()).slice(-2);\n            var month = (\"0\" + (now.getMonth() + 1)).slice(-2);\n            return now.getFullYear() + \"-\" + (month) + \"-\" + (day);\n        }\n    });\n\n})(jQuery);\n\n(function () {\n\n    $.fn.eosinputcurrency = function (options) {\n\n        options = $.extend({\n            symbol: \"\u00a3\"\n        }, options);\n\n        $(this).each(function () {\n\n            const element = $(this);\n\n            element.on(\"focus\", function () {\n                const val = parseFloat($(this).val().replace(options.symbol, \"\"));\n                if (!val) {\n                    element.val(options.symbol);\n                }\n            });\n\n            const format = function () {\n\n                if (!element.val().length) {\n                    element.val(options.symbol);\n                    element.trigger(\"formatted\", 0);\n                } else {\n                    let cval = element.val();\n\n                    cval = cval.replace(\/[.](?=.*[.])\/g, \"\");\/\/dump any extra decimals the client may have added!\n\n                    if (cval[0] !== options.symbol) {\n                        element.val(options.symbol + cval.replace(\/\\B(?=(\\d{3})+(?!\\d))\/g, \",\"));\n                    } else {\n                        var replace = options.symbol;\n                        var re = new RegExp(replace, \"g\");\n                        cval = cval.replace(re, \"\").replace(\/,\/g, \"\");\n                        \/\/cval = new String(Math.round(cval));\n                        element.val(options.symbol + cval.replace(\/\\B(?=(\\d{3})+(?!\\d))\/g, \",\"));\n                    }\n\n                    element.trigger(\"formatted\", {\"symbol\": options.symbol, \"value\": cval});\n                }\n            };\n\n            format();\n\n            element.on(\"input\", format);\n        });\n\n    };\n\n})(jQuery);\n\n(function () {\n\n    $.fn.eosinputreferencenumber = function (options) {\n\n        options = $.extend({\n            symbol: \"#\"\n        }, options);\n\n        const el = $(this);\n\n        const replace_content = function () {\n            var cval = el.val();\n            if (cval[0] !== options.symbol) {\n                el.val(options.symbol + cval);\n            } else {\n                var replace = options.symbol;\n                var re = new RegExp(replace, \"g\");\n                cval = cval.replace(re, \"\").replace(\/,\/g, \"\");\n                \/\/cval = new String(Math.round(cval));\n                el.val(options.symbol + cval);\n            }\n        };\n\n        $(this).on(\"input\", function () {\n            if (!$(this).val().length) {\n                $(this).val(options.symbol);\n            } else {\n                replace_content();\n            }\n        });\n\n        replace_content();\n    };\n\n})(jQuery);\n\n(function ($) {\n    $.extend({\n        eosbusy: {\n            show: function () {\n                if (!$(\"#eos-busy\").length) {\n\n                    var src = \"\/images\/busy\/busy.gif\";\n\n                    if (eosglobalconfig.busysrc) {\n                        src = eosglobalconfig.busysrc;\n                    }\n\n                    busy_text = eosglobalconfig[\"busy-text\"];\n\n                    const bdiv = $(\"<div id='eos-busy'><\/div>\");\n\n                    bdiv.append(\"<img src='\" + src + \"' \/>\");\n\n                    if (busy_text) {\n                        bdiv.append(\"<label>\" + busy_text + \"<\/label>\");\n                    }\n                    $(\"body\").append(bdiv);\n                } else {\n                    $(\"#eos-busy\").removeClass(\"hidden\");\n                }\n            },\n            hide: function ( ) {\n                $(\"#eos-busy\").addClass(\"hidden\");\n            }\n        }\n    });\n})(jQuery);\n\n\/\/confirmation dialogue\n(function ($) {\n    $.extend({\n        eosmsg: function (options) {\n\n            if (!options) {\n                options = {};\n            }\n\n            if (typeof (options) !== \"object\") {\n                options = {\n                    data: options\n                };\n            }\n\n            \/\/blah();\n            \/\/console.log(options);\n\n            options = $.extend({\n                title: \"\",\n                container: \"\",\n                content: \"\",\n                classes: \"\",\n                \"auto-close\": false,\n                \"actimeout\": 1000,\n                click: function () {},\n                onload: function () {},\n                onclose: function () {},\n                data: {},\n                width: \"auto\",\n                height: \"auto\",\n                maxWidth: $(window).width(),\n                buttons: [\n                    {\n                        text: \"OK\",\n                        icon: \"ui-icon-comment\",\n                        click: function () {\n                            $(this).dialog(\"close\");\n                            options.onclose();\n                        }\n                    }\n                ]\n            }, options);\n\n            if (!options.data.status && !options.status) {\n                if (!options.content) {\n                    options.content = options.data;\n                }\n            } else {\n                if (options.data.content) {\n                    options.content = options.data.content;\n                }\n            }\n\n            var ddiv = $(\"<div\/>\");\n            ddiv.html(options.content);\n            if (options.data.warnings) {\n                ddiv.append(\"<div class='warnings'><h2>Warnings were issued<\/h2><hr\/>\" + options.data.warnings + \"<\/div>\");\n            }\n            if (options.container) {\n                ddiv.appendTo(options.container);\n            } else {\n                ddiv.appendTo(\"body\");\n            }\n\n            if (options.onload) {\n                options.onload(ddiv);\n            }\n\n            if (options[\"auto-close\"]) {\n                options.open = function () {\n                    setTimeout(function () {\n                        ddiv.dialog(\"close\");\n                    }, options.actimeout);\n                };\n            }\n\n            ddiv.dialog(options);\n            $(document).trigger(\"eos-msg-opened\");\n        }\n    });\n\n\n})(jQuery);\n\n(function () {\n    $.fn.base64upload = function (options) {\n        options = $.extend({\n            input_name: \"upload\",\n            input: $(this).find(\".file-data\"),\n            fninput: $(this).find(\".file-name-input\"),\n            onnewfile: function (el, data) {},\n            onfilecomplete: function () {},\n            onchunkread: function (el, data, callback) {\n                callback();\n            },\n            chunksize: 0\n        }, options);\n\n        this.addClass(\"base64upload\");\n\n        let domel = this;\n        let element = this;\n\n        if (!this.length) {\n            return;\n        }\n\n        if (this[0].tagName === \"A\") {\n            const next_el = $(this).next();\n            if (!next_el.hasClass(\"auto-appended-base64\")) {\n                element = $(\"<div class='auto-appended-base64'><input type='file' name='file' class='hidden' \/><\/div>\");\n                $(this).after(element);\n            } else {\n                element = $(this).next();\n            }\n            $(this).on(\"click\", function (e) {\n                e.preventDefault();\n                element.find(\"input[type='file']\").trigger(\"click\");\n            });\n        } else {\n            $(this).find(\"a.upload\").on(\"click\", function (e) {\n                e.preventDefault();\n                element.find(\"input[type='file']\").trigger(\"click\");\n            });\n        }\n\n        element.find(\"input[type='file']\").on(\"click\", function (e) {\n            if (element.hasClass(\"disabled\")) {\n                e.preventDefault();\n                return;\n            }\n        });\n\n        element.find(\"input[type='file']\").off(\"change\").on(\"change\", function (e, ep) {\n\n            var files = this.files;\n            if (typeof files !== \"undefined\") {\n                (function () {\n                    var num_files = files.length;\n\n                    if (!num_files) {\n                        alert(\"No Files Selected\");\n                        return;\n                    }\n\n                    $.each(files, function () {\n                        var file = this;\n                        var reader = new FileReader();\n                        var slice = null;\n                        var total = this.size;\n                        var fn = this.name;\n\n                        if (options.chunksize) {\n                            options.onnewfile(element, fn, function () {\n                                slice = file.slice(0, options.chunksize);\n                                reader.readAsDataURL(slice);\n                            });\n\n                        } else {\n                            reader.readAsDataURL(this);\n                        }\n\n                        var loaded = 0;\n                        var first_chunk = true;\n\n                        reader.onload = function (e) {\n\n                            loaded += options.chunksize;\n\n                            if (options.chunksize) {\n                                var data = {\n                                    \"name\": fn,\n                                    \"total\": total,\n                                    \"loaded\": loaded,\n                                    \"first-chunk\": first_chunk,\n                                    \"chunksize\": options.chunksize,\n                                    \"data\": e.target.result\n                                };\n\n                                first_chunk = false;\n\n                                options.onchunkread(element, data, function () {\n                                    if (loaded <= total) {\n                                        slice = file.slice(loaded, loaded + options.chunksize);\n                                        reader.readAsDataURL(slice);\n                                    } else {\n                                        data.data = null;\n                                        options.onfilecomplete(element, data);\n                                    }\n                                });\n                            } else {\n\n                                var data = {\n                                    \"name\": fn,\n                                    \"data\": e.target.result\n                                };\n\n                                if (options.input.length) {\n                                    options.input.val(e.target.result);\n                                }\n\n                                if (options.fninput.length) {\n                                    options.fninput.val(fn);\n                                }\n\n                                const fn_display = domel.find(\".file-name-display\").html(fn);\n\n                                domel.trigger(\"new-file\", data);\n                                options.onnewfile(domel, data);\n                            }\n                        };\n                    });\n                })();\n            } else {\n                alert(\"No support for the File API in this web browser\");\n            }\n        });\n\n        return $(this);\n    };\n})(jQuery);\n\n(function () {\n    $.fn.eosapi = function (options) {\n\n        options = $.extend({\n            method: \"post\",\n            cache: true,\n            nodefault: true,\n            query: {},\n            req: [\"html\"],\n            event: \"click\",\n            href: $(this).attr(\"href\"),\n            success: function () {},\n            before: function () {}\n        }, options);\n\n        options.query.eosapi = true;\n        var trigger = $(this);\n\n        $(this).off(options.event).on(options.event, function (e) {\n            if (options.nodefault) {\n                e.preventDefault();\n            }\n            if ($(this).hasClass(\"eos-api-loaded\")) {\n                options.success(null, trigger);\n                return;\n            }\n\n            var query = options.query;\n\n            if (options.before) {\n                query = $.extend(options.before(trigger), query);\n            }\n\n            switch (options.method) {\n                case \"post\":\n                    $.post(options.href, query, function (data) {\n\n                        for (var i in options.req) {\n                            if (!data[options.req[i]]) {\n                                $.eosmsg(\"Data Missing: \" + options.req[i] + \"\\n\" + data);\n                                return;\n                            }\n                        }\n                        options.success(data, trigger);\n                        if (options.cache) {\n                            trigger.addClass(\"eos-api-loaded\");\n                        }\n                    });\n                    break;\n\n                case \"get\":\n                    $.get(options.href, function (data) {\n                        for (var i in options.req) {\n                            if (!data[options.req[i]]) {\n                                alert(\"Data Missing: \" + options.req[i] + \"\\n\" + data);\n                                return;\n                            }\n                        }\n                        options.success(data, trigger);\n                        if (options.cache) {\n                            trigger.addClass(\"eos-api-loaded\");\n                        }\n                    });\n                    break;\n            }\n        });\n    };\n})(jQuery);\n\n\/\/legacy plugins \/ functions from here down\n\n(function ($) {\n    $.extend({\n        print_content: function (options) {\n            \/\/console.log(options);\n\n            $(\"#ifpop-print\").remove();\n            \/\/var relname = $(this).attr(\"rel\");\n            var iframe = $(\"<iframe style='position:absolute'><\/iframe>\");\n            iframe.attr(\"id\", \"ifpop-print\");\n            iframe.attr(\"height\", \"1024\");\n            iframe.attr(\"width\", \"1024\");\n            $(\"body\").append(iframe);\n\n\n            iframe.css({\n                \"left\": \"-1024px\",\n                \"top\": \"0px\"\n            });\n\n\n            $(iframe).on(\"load\", function () {\n                var fdoc = $(\"#ifpop-print\").get(0).contentWindow.document;\n                $(\"head\", fdoc).append($(\"head\").find($(\"link[rel='stylesheet']\")).clone());\n                $(\"head\", fdoc).append($(\"head\").find($(\"style\")).clone());\n                $(\"head\", fdoc).append($(\"<title>\" + options.relname + \"<\/title>\"));\n                $(\"body\", fdoc).append(options.content);\n                $(\"a\", fdoc).addClass(\"hidden\");\n\n                var link_count = $(\"link\", fdoc).length;\n                var loaded_links = 0;\n                $(\"link\", fdoc).on(\"load\", function (e) {\n                    loaded_links++;\n                    if (loaded_links == link_count) {\n                        $(\"#ifpop-print\").get(0).contentWindow.print();\n                    }\n                });\n            });\n        }\n    });\n})(jQuery);\n\n$(window).resize(function () {\n    $(\".ui-dialog-content:visible\").each(function () {\n        $(this).dialog(\"option\", \"position\", \"center\");\n    });\n});\n\n$(document).ready(function () {\n\n    $(\".printable-block.button\").on(\"click\", function (e) {\n        e.preventDefault();\n        var parent = $(this).parent();\n        var content = \"\";\n        while (true) {\n            var printable = $(\".printable\", parent);\n            if (printable.length) {\n                content = printable.html();\n                break;\n            }\n            parent = parent.parent();\n            if (!parent.length) {\n                break;\n            }\n        }\n\n        if (!content.length) {\n            alert(\"No printable content found\");\n            return;\n        }\n\n        $(this).removeClass(\"hidden\");\n        $.print_content({content: content});\n    });\n    var button = null;\n\n    $(document).on(\"dialogopen local-ready\", function () {\n        $(\".printable-content.button\").on(\"click\", function (e) {\n            e.preventDefault();\n            button = $(this);\n            $(\".ifpop-temp\").remove();\n            print_content(button.attr(\"href\"));\n        });\n    });\n    $(document).trigger(\"local-ready\");\n\n    var print_content = function (url) {\n        var iframe = $(\"<iframe style='position:absolute'><\/iframe>\");\n        iframe.attr(\"src\", url);\n        iframe.attr(\"width\", \"800\");\n        iframe.attr(\"id\", \"ipf_nopop\");\n        iframe.addClass(\"ifpop-temp\");\n        iframe.attr(\"height\", \"600\");\n        iframe.css({\n            \"left\": \"-900px\"\n        });\n        $(\"body\").append(iframe);\n        $.eosbusy.show();\n        iframe.load(function () {\n            $.eosbusy.hide();\n            this.focus();\n            this.contentWindow.focus();\n            \/\/console.log($(\"#ipf_nopop\").get(0).contentWindow);\n            $(\"#ipf_nopop\").get(0).contentWindow.print();\n        });\n        return;\n    };\n\n    const init = function () {\n\n        if (typeof (matchMedia) !== \"undefined\") {\n            if (matchMedia('only screen and (max-width: 640px)').matches) {\n                $(\".collapsible\").each(function () {\n                    if (!$(this).hasClass(\"collapse-connected\")) {\n                        $(this).addClass(\"collapse-connected\");\n                        var cole = $(this);\n                        var cc = cole.find(\".collapsible-content:first\");\n                        var ct = cole.find(\".collapsible-trigger:first\");\n                        ct.css({\n                            cursor: 'pointer'\n                        });\n                        cc.css({\n                            display: 'initial'\n                        });\n                        cc.addClass(\"hidden\");\n                        ct.off(\"click\").on(\"click\", function (e) {\n                            e.preventDefault();\n                            cc.toggleClass(\"hidden\");\n                        });\n                    }\n                });\n            } else {\n                $(\".collapsible\").each(function () {\n                    $(this).removeClass(\"collapse-connected\");\n                    var cole = $(this);\n                    var cc = $(this).find(\".collapsible-content\");\n                    var ct = cole.find(\".collapsible-trigger\");\n                    ct.css({\n                        cursor: 'default'\n                    });\n                    cc.removeClass(\"hidden\");\n                    cc.addClass(\"content-open\");\n                    cole.find(\".collapsible-trigger\").off(\"click\");\n                });\n            }\n        }\n\n        $(\".collapsible-always\").each(function () {\n            var cole = $(this);\n            var cc = cole.find(\".collapsible-content:first\");\n            var ct = cole.find(\".collapsible-trigger:first\");\n            var collapsible_container = $(this).parents(\".collapsible-container:first\");\n            ct.css({\n                cursor: 'pointer'\n            });\n\n            if (cole.hasClass(\"expand-up\")) {\n                cc.css({\n                    bottom: ct.height(),\n                    position: \"absolute\"\n                });\n            }\n            \/*\n             cc.css({\n             display: 'inline-block'\n             });*\/\n\n            \/\/cc.addClass(\"hidden\");\n\n            ct.off(\"click\").on(\"click\", function (e) {\n                e.preventDefault();\n                if (collapsible_container.length) {\/\/close all other collapsibles\n                    collapsible_container.find(\".collapsible-always\").not(cole).find(\".collapsible-content:first\").addClass(\"hidden\");\n                }\n                cc.toggleClass(\"hidden\");\n                cc.trigger(\"changed\");\n            });\n        });\n\n        $(\".collapsible-block:not(.initialised)\").each(function () {\n            $(this).addClass(\"initialised\");\n            var cole = $(this);\n            var cc = cole.find(\".collapsible-content:first\");\n            var ct = cole.find(\".collapsible-trigger:first\");\n            ct.css({\n                cursor: 'pointer'\n            });\n\n            cc.addClass(\"hidden\");\n            ct.on(\"click\", function (e) {\n                e.preventDefault();\n                cc.toggleClass(\"hidden\");\n                if (cc.hasClass(\"hidden\")) {\n                    ct.addClass(\"closed\");\n                    ct.removeClass(\"open\");\n                } else {\n                    ct.addClass(\"open\");\n                    ct.removeClass(\"closed\");\n                }\n            });\n        });\n\n    };\n\n    $(window).on(\"resize content-updated\", function (e) {\n        init();\n    });\n\n    init();\n    var config_meta = $(\"#page-config\");\n    if (config_meta.length) {\n        try {\n            var config = $.parseJSON(config_meta.attr(\"data\"));\n            if (config[\"email-document-enabled\"]) {\n\n                var default_value = \"Email Address\";\n                if (config[\"user-email\"]) {\n                    default_value = config[\"user-email\"];\n                } else {\n                    if (config[\"email-document-default-value\"]) {\n                        default_value = config[\"email-document-default-value\"];\n                    }\n                }\n\n                var link_name = config[\"email-document-link-name\"];\n                if (!link_name) {\n                    link_name = \"Email Document\";\n                }\n\n                $(\"a[data-email-link]\").each(function () {\n\n                    if ($(this).parents(\".eos-editor\").length) {\/\/don't add into admin!!!\n                        return -1;\n                    }\n\n                    $(this).after(\"<div class='email-link'><input type='text' value='\" + default_value + \"' \/><a href='' class='button email-link-trigger'>\" + link_name + \"<\/a><\/div>\");\n                    var link = $(this);\n                    var el = $(this).next();\n                    el.find(\"input\").on(\"click\", function (e) {\n                        $(this).val(\"\");\n                    });\n                    el.find(\"input\").on(\"blur\", function (e) {\n                        if (!$(this).val()) {\n                            $(this).val($(this).attr(\"value\"));\n                        }\n                    });\n                    el.find(\"a\").on(\"click\", function (e) {\n                        e.preventDefault();\n                        var query = {\n                            email: el.find(\"input\").val(),\n                            path: link.attr(\"href\")\n                        };\n                        $.post(\"\/email-template\/api\/send-document\", query, function (data) {\n                            if (!data.status) {\n                                alert(data);\n                            } else {\n                                if (data.error) {\n                                    alert(data.error);\n                                } else {\n                                    alert(data.message);\n                                }\n                            }\n                        });\n                    });\n                });\n            }\n        } catch (e) {\n        }\n    }\n\n    $(\"img.ee-zoomable\").each(function () {\n\n        $(this).on(\"click\", function () {\n\n            if ($(\"body\").hasClass(\"ee-image-zoomed\")) {\n                return;\n            }\n\n            const div = $(\"<div class='ee-zoomed' style='left:-10px;'><span class='ee-zoomed-close'>X<\/span><\/div>\");\n            const img = $(\"<img src='\" + $(this).attr(\"data-orig-path\") + \"' \/>\");\n\n            var center_image = function (img) {\n\n                let img_width = img.prop(\"naturalWidth\");\n                let img_height = img.prop(\"naturalHeight\");\n\n                const aspect = img_width \/ img_height;\n\n                const window_width = $(window).width();\n                const window_height = $(window).height();\n\n                if (img_width > window_width) {\n                    img_width = window_width;\n                    img.width(img_width);\n                    img_height = img_width * aspect;\n                }\n\n                if (img_height > window_height) {\n                    img_height = window_height;\n                    img.height(window_height);\n                    img_width = img_height * aspect;\n                }\n\n                \/\/console.log(\"Img Width = \" + img_width + \" & Window Width = \" + window_width + \" Img Height = \" + img_height + \" Window Height = \" + window_height);\n\n                div.css({\n                    left: (window_width - img_width) \/ 2 + \"px\",\n                    top: ((window_height - img_height) \/ 2) + \"px\",\n                    width: img_width + \"px\",\n                    height: img_height + \"px\"\n                });\n            };\n\n            div.append(img);\n\n            img.on(\"load\", function () {\n                center_image(img);\n            });\n\n            $(\"body\").append(div);\n\n            if (img[0].complete) {\n                center_image(img);\n            }\n\n            $(\"body\").addClass(\"ee-image-zoomed\");\n            div.find(\".ee-zoomed-close\").on(\"click\", function () {\n                div.remove();\n                $(\"body\").removeClass(\"ee-image-zoomed\");\n            });\n        });\n    });\n\n});\n\nconst maxz = function (element, zIndex) {\n\n    const position = element.css(\"position\");\n    let lz = 0;\n\n    const parent = element.parent();\n\n    if (position === \"absolute\" || position === \"relative\" || position === \"fixed\") {\n        lz = parseInt(element.css(\"zIndex\"));\n    }\n\n    if (zIndex !== undefined) {\n        if (lz > zIndex) {\n            return maxz(parent, lz);\n        }\n    } else {\n        if (parent.length && parent[0] !== \"documment\") {\n            return maxz(parent, lz);\n        } else {\n            return lz;\n        }\n\n    }\n\n    return zIndex;\n};\n\n\/*******\n\/include\/script\/core\/editable-select.js\n*********\/\n(function () {\n    $.fn.eoseditableselect = function (options) {\n        \n        options = $.extend({\n        }, options);\n        var container = $(this);\n        var timeout = null;\n        \n        container.find(\".es-option-list\").editableSelect({\n            duration: 200,\n            filter: false\n        });\n        \n        var ol = container.find(\".es-option-list\");\n        ol.on(\"select.editable-select\", function (e, d) {\n            if (d) {\n                container.find(\".es-option-val\").val($(d).attr(\"value\"));\n                ol.editableSelect(\"hide\");\n            }\n        });\n        ol.on(\"input\", function () {\n\n            if (timeout) {\n                clearTimeout(timeout);\n            }\n\n            var input = $(this);\n            timeout = setTimeout(function () {\n\n                var query = {\n                    str: input.val()\n                };\n                $.post(container.attr(\"data-api-path\"), query, function (data) {\n                    if (!data.status) {\n                        $.eosmsg(data);\n                    } else {\n                        ol.editableSelect(\"clear\");\n                        $.each(data.list, function () {\n                            ol.editableSelect(\"add\", this.name, 0, [{\n                                    name: \"value\",\n                                    value: this[\"id\"]\n                                }]);\n                        });\n                        ol.editableSelect(\"show\");\n                        ol.find(\".es-list\").css({\n                            display: true\n                        });\n                        container.find(\".es-option-val\").val(query.str);\n                    }\n                });\n            }, 300);\n        });\n    };\n})(jQuery);\n\n\/*******\n\/include\/script\/eos-dialogue.js\n*********\/\n(function () {\n    $.fn.eosdialogue = function (options) {\n        var options = $.extend({\n            \/\/title: $(this).attr(\"data-dialogue-title\"),\n            closeonsave: true,\n            query: {},\n            req: [\"html\"],\n            event: \"click\",\n            href: $(this).attr(\"href\"),\n            width: \"auto\",\n            height: \"auto\",\n            maxHeight: $(window).height(),\n            autoResize: true,\n            modal: true,\n            allchecboxes: false,\n            classes: {\n                \"ui-dialog\": \"eos-dialogue\"\n            },\n            position: {\n                my: \"center\",\n                at: \"center\",\n                of: window,\n                collision: \"fit\"\n            },\n            beforeclose: function(event, ui){\n                \n            },\n            onclose: function (ddiv, el, trigger) {\n                $(ddiv).dialog(\"close\");\n            },\n            close: function (e, ui) {\n                $(this).remove();\n            },\n            beforeload: function (data, ddiv) {},\n            onload: function (ddiv, trigger, data) {},\n            onsave: function (data, trigger) {\n                if (!data.success) {\n                    $.eosbusy.hide();\n                    $.eosmsg(data);\n                    return false;\n                }\n                return true;\n            },\n            save: function (ddiv, button, trigger) {\n                $.eosbusy.show();\n                \n                if(ddiv.data(\"before-save\")){\n                    ddiv.data(\"before-save\")();\n                }\n                \n                const query = ddiv.serializeObject({\n                    \"include-unchecked\": options.allcheckboxes\n                });\n                \n                if(options.savequeryappend){\n                    $.extend(query, options.savequeryappend());\n                }\n                \n                $.post($(button).attr(\"href\"), query, function (data) {\n                    $.eosbusy.hide();\n                    if (options.onsave(data, trigger)) {\n                        if (options.closeonsave) {\n                            $(ddiv).dialog(\"destroy\").remove();\n                        }\n                    }\n                }, null, ajsettings).fail(function (jqXHR, text) {\n                    $.eosbusy.hide();\n                    console.log(\"AJAX Fail\");\n                    $.eosmsg(text);\n                });\n            },\n            onconfirm: function (data, trigger) {\n                return true;\n            },\n            get_query: function (trigger) {\n                return {};\n            }\n        }, options);\n\n        options.query.eosapi = true;\n        var trigger = $(this);\n\n        var ajsettings = {\n            error: function (jqXHR, text, error) {\n                $.eosmsg(text);\n            }\n        };\n        \n        if(!options.href){\n            options.href = $(this).attr(\"data-api-path\");\n        }\n\n        $(this).off(options.event).on(options.event, function (e, args) {\n            e.preventDefault();\n\n            if ($(this).hasClass(\"disabled\")) {\n                return;\n            }\n\n            $.eosbusy.show();\n\n            var oss = $(window).scrollTop();\n\n            options.eventargs = args;\n\n            if (options.get_query) {\n                options.query = $.extend(options.query, options.get_query(this, args));\n            }\n\n            $.post(options.href, options.query, function (data) {\n                $.eosbusy.hide();\n\n                if (options.beforeload) {\n                    try {\n                        options.beforeload(data, ddiv);\n                    } catch (e) {\n                        return;\n                    }\n                }\n\n                for (var i in options.req) {\n                    if (!data[options.req[i]]) {\n                        if (options.req[i] === \"html\") {\n                            $.eosmsg(data);\n                            return;\n                        } else {\n                            $.eosmsg(\"Data Missing: \" + options.req[i] + \"\\n\" + data);\n                            return;\n                        }\n                    }\n                }\n\n                var ddiv = $(\"<div><\/div>\");\n                ddiv.data({\"owner\": trigger});\n                \n                if(data[\"dialogue-title\"]){\n                    options.title = data[\"dialogue-title\"];\n                }\n                \n                ddiv.attr(\"title\", options.title);\n                ddiv.html(data.html);\n                ddiv.addClass(\"dialog\");\n                ddiv.appendTo(\"body\");\n\n                \/\/console.log(options);\n\n                options.open = function () {\n                    if ($(\"#ui-datepicker-div\").length) {\n                        \/\/console.log(\"destroying date pickers\");\n                        $(\"#ui-datepicker-div\").appendTo(\"body\");\/\/make sure dp always goes after us, else has a nasty habbit of hidding behind us\n                    }\n                };\n\n                \/*\n                 $(\".button.close\", ddiv).on(\"click\", function (e) {\n                 e.preventDefault();\n                 $(this).parents(\".dialog\").remove();\n                 });*\/\n\n                $(ddiv).find(\".image-input\").each(function () {\n                    $(this).base64image({\n                        input: $(this).find(\".image-data\")\n                    });\n                });\n\n                $(ddiv).find(\".file-input\").each(function () {\n                    $(this).base64upload({\n                        input: $(this).find(\".file-data\"),\n                        fninput: $(this).find(\".file-name\")\n                    });\n                });\n\n                $(\".button.cancel,.button.close\", ddiv).on(\"click\", function (e) {\n                    e.preventDefault();\n                    options.onclose(ddiv, this, trigger);\n                });\n\n                $(\".button.save,.save-button\", ddiv).on(\"click\", function (e) {\n                    e.preventDefault();\n                    if($(this).hasClass(\"disabled\")){\n                        return;\n                    }\n                    options.save(ddiv, this, trigger);\n                });\n\n                $(\".button.confirm\", ddiv).on(\"click\", function (e) {\n                    e.preventDefault();\n                    $.eosbusy.show();\n                    const query = ddiv.serializeObject();\n                    query.confirm = true;\n                    $.post($(this).attr(\"href\"), query, function (data) {\n                        $.eosbusy.hide();\n                        if (options.onconfirm(data, trigger, ddiv)) {\n                            $(ddiv).dialog(\"destroy\");\n                        }\n                    }, null, ajsettings).fail(function (jqXHR, text) {\n                        $.eosmsg(text);\n                    });\n                });\n\n                \/*\n                 $(\".editor\", ddiv).each(function () {\n                 $(this).editable({});\n                 });*\/\n\n                var sections = $(ddiv).find(\".dialogue-main-content:first\").children(\".sections\");\n                sections.children(\".dialogue-section:first\").removeClass(\"hidden\");\n\n                $(ddiv).find(\".dialogue-main-content:first\").children(\".section-tabs\").find(\".section-tab\").each(function () {\n                    $(this).on(\"click\", function () {\n                        sections.children(\".dialogue-section\").addClass(\"hidden\");\n                        sections.children(\".dialogue-section\").removeClass(\"active\");\n                        sections.children(\".dialogue-section[data-name='\" + $(this).attr(\"data-name\") + \"']\").removeClass(\"hidden\");\n                        sections.children(\".dialogue-section[data-name='\" + $(this).attr(\"data-name\") + \"']\").addClass(\"active\");\n                    });\n                });\n\n                $(\".character-feedback\", ddiv).each(function () {\n                    $(this).characterfeedback();\n                });\n                \n                $(ddiv).dialog(options);\n\n                $(document).trigger(\"structure-updated\");\n\n                if (options.onload) {\n                    options.onload(ddiv, trigger, data);\n                }\n\n                if (data.js) {\n                    const tf = new Function(data.js);\n                    tf(ddiv, trigger);\n                }\n\n                $(ddiv).find(\".eos-editable-select\").each(function () {\n                    $(this).eoseditableselect();\n                });\n\n                $(window).scrollTop(oss);\n                $(document).trigger(\"dialogue-opened\", ddiv);\n\n            }, null, ajsettings).fail(function (jqXHR, text) {\n                $.eosbusy.hide();\n                $.eosmsg(text);\n            });\n        });\n    };\n})(jQuery);\n\n\/*******\n\/include\/script\/lazysizes.min.js\n*********\/\n\/*! lazysizes - v5.2.0-beta1 *\/\n!function(a,b){var c=b(a,a.document);a.lazySizes=c,\"object\"==typeof module&&module.exports&&(module.exports=c)}(\"undefined\"!=typeof window?window:{},function(a,b){\"use strict\";var c,d;if(function(){var b,c={lazyClass:\"lazyload\",loadedClass:\"lazyloaded\",loadingClass:\"lazyloading\",preloadClass:\"lazypreload\",errorClass:\"lazyerror\",autosizesClass:\"lazyautosizes\",srcAttr:\"data-src\",srcsetAttr:\"data-srcset\",sizesAttr:\"data-sizes\",minSize:40,customMedia:{},init:!0,expFactor:1.5,hFac:.8,loadMode:2,loadHidden:!0,ricTimeout:0,throttleDelay:125};d=a.lazySizesConfig||a.lazysizesConfig||{};for(b in c)b in d||(d[b]=c[b])}(),!b||!b.getElementsByClassName)return{init:function(){},cfg:d,noSupport:!0};var e=b.documentElement,f=a.Date,g=a.HTMLPictureElement,h=\"addEventListener\",i=\"getAttribute\",j=a[h],k=a.setTimeout,l=a.requestAnimationFrame||k,m=a.requestIdleCallback,n=\/^picture$\/i,o=[\"load\",\"error\",\"lazyincluded\",\"_lazyloaded\"],p={},q=Array.prototype.forEach,r=function(a,b){return p[b]||(p[b]=new RegExp(\"(\\\\s|^)\"+b+\"(\\\\s|$)\")),p[b].test(a[i](\"class\")||\"\")&&p[b]},s=function(a,b){r(a,b)||a.setAttribute(\"class\",(a[i](\"class\")||\"\").trim()+\" \"+b)},t=function(a,b){var c;(c=r(a,b))&&a.setAttribute(\"class\",(a[i](\"class\")||\"\").replace(c,\" \"))},u=function(a,b,c){var d=c?h:\"removeEventListener\";c&&u(a,b),o.forEach(function(c){a[d](c,b)})},v=function(a,d,e,f,g){var h=b.createEvent(\"Event\");return e||(e={}),e.instance=c,h.initEvent(d,!f,!g),h.detail=e,a.dispatchEvent(h),h},w=function(b,c){var e;!g&&(e=a.picturefill||d.pf)?(c&&c.src&&!b[i](\"srcset\")&&b.setAttribute(\"srcset\",c.src),e({reevaluate:!0,elements:[b]})):c&&c.src&&(b.src=c.src)},x=function(a,b){return(getComputedStyle(a,null)||{})[b]},y=function(a,b,c){for(c=c||a.offsetWidth;c<d.minSize&&b&&!a._lazysizesWidth;)c=b.offsetWidth,b=b.parentNode;return c},z=function(){var a,c,d=[],e=[],f=d,g=function(){var b=f;for(f=d.length?e:d,a=!0,c=!1;b.length;)b.shift()();a=!1},h=function(d,e){a&&!e?d.apply(this,arguments):(f.push(d),c||(c=!0,(b.hidden?k:l)(g)))};return h._lsFlush=g,h}(),A=function(a,b){return b?function(){z(a)}:function(){var b=this,c=arguments;z(function(){a.apply(b,c)})}},B=function(a){var b,c=0,e=d.throttleDelay,g=d.ricTimeout,h=function(){b=!1,c=f.now(),a()},i=m&&g>49?function(){m(h,{timeout:g}),g!==d.ricTimeout&&(g=d.ricTimeout)}:A(function(){k(h)},!0);return function(a){var d;(a=!0===a)&&(g=33),b||(b=!0,d=e-(f.now()-c),d<0&&(d=0),a||d<9?i():k(i,d))}},C=function(a){var b,c,d=99,e=function(){b=null,a()},g=function(){var a=f.now()-c;a<d?k(g,d-a):(m||e)(e)};return function(){c=f.now(),b||(b=k(g,d))}},D=function(){var g,m,o,p,y,D,F,G,H,I,J,K,L=\/^img$\/i,M=\/^iframe$\/i,N=\"onscroll\"in a&&!\/(gle|ing)bot\/.test(navigator.userAgent),O=0,P=0,Q=0,R=-1,S=function(a){Q--,(!a||Q<0||!a.target)&&(Q=0)},T=function(a){return null==K&&(K=\"hidden\"==x(b.body,\"visibility\")),K||!(\"hidden\"==x(a.parentNode,\"visibility\")&&\"hidden\"==x(a,\"visibility\"))},U=function(a,c){var d,f=a,g=T(a);for(G-=c,J+=c,H-=c,I+=c;g&&(f=f.offsetParent)&&f!=b.body&&f!=e;)(g=(x(f,\"opacity\")||1)>0)&&\"visible\"!=x(f,\"overflow\")&&(d=f.getBoundingClientRect(),g=I>d.left&&H<d.right&&J>d.top-1&&G<d.bottom+1);return g},V=function(){var a,f,h,j,k,l,n,o,q,r,s,t,u=c.elements;if((p=d.loadMode)&&Q<8&&(a=u.length)){for(f=0,R++;f<a;f++)if(u[f]&&!u[f]._lazyRace)if(!N||c.prematureUnveil&&c.prematureUnveil(u[f]))ba(u[f]);else if((o=u[f][i](\"data-expand\"))&&(l=1*o)||(l=P),r||(r=!d.expand||d.expand<1?e.clientHeight>500&&e.clientWidth>500?500:370:d.expand,c._defEx=r,s=r*d.expFactor,t=d.hFac,K=null,P<s&&Q<1&&R>2&&p>2&&!b.hidden?(P=s,R=0):P=p>1&&R>1&&Q<6?r:O),q!==l&&(D=innerWidth+l*t,F=innerHeight+l,n=-1*l,q=l),h=u[f].getBoundingClientRect(),(J=h.bottom)>=n&&(G=h.top)<=F&&(I=h.right)>=n*t&&(H=h.left)<=D&&(J||I||H||G)&&(d.loadHidden||T(u[f]))&&(m&&Q<3&&!o&&(p<3||R<4)||U(u[f],l))){if(ba(u[f]),k=!0,Q>9)break}else!k&&m&&!j&&Q<4&&R<4&&p>2&&(g[0]||d.preloadAfterLoad)&&(g[0]||!o&&(J||I||H||G||\"auto\"!=u[f][i](d.sizesAttr)))&&(j=g[0]||u[f]);j&&!k&&ba(j)}},W=B(V),X=function(a){var b=a.target;if(b._lazyCache)return void delete b._lazyCache;S(a),s(b,d.loadedClass),t(b,d.loadingClass),u(b,Z),v(b,\"lazyloaded\")},Y=A(X),Z=function(a){Y({target:a.target})},$=function(a,b){try{a.contentWindow.location.replace(b)}catch(c){a.src=b}},_=function(a){var b,c=a[i](d.srcsetAttr);(b=d.customMedia[a[i](\"data-media\")||a[i](\"media\")])&&a.setAttribute(\"media\",b),c&&a.setAttribute(\"srcset\",c)},aa=A(function(a,b,c,e,f){var g,h,j,l,m,p;(m=v(a,\"lazybeforeunveil\",b)).defaultPrevented||(e&&(c?s(a,d.autosizesClass):a.setAttribute(\"sizes\",e)),h=a[i](d.srcsetAttr),g=a[i](d.srcAttr),f&&(j=a.parentNode,l=j&&n.test(j.nodeName||\"\")),p=b.firesLoad||\"src\"in a&&(h||g||l),m={target:a},s(a,d.loadingClass),p&&(clearTimeout(o),o=k(S,2500),u(a,Z,!0)),l&&q.call(j.getElementsByTagName(\"source\"),_),h?a.setAttribute(\"srcset\",h):g&&!l&&(M.test(a.nodeName)?$(a,g):a.src=g),f&&(h||l)&&w(a,{src:g})),a._lazyRace&&delete a._lazyRace,t(a,d.lazyClass),z(function(){var b=a.complete&&a.naturalWidth>1;p&&!b||(b&&s(a,\"ls-is-cached\"),X(m),a._lazyCache=!0,k(function(){\"_lazyCache\"in a&&delete a._lazyCache},9)),\"lazy\"==a.loading&&Q--},!0)}),ba=function(a){if(!a._lazyRace){var b,c=L.test(a.nodeName),e=c&&(a[i](d.sizesAttr)||a[i](\"sizes\")),f=\"auto\"==e;(!f&&m||!c||!a[i](\"src\")&&!a.srcset||a.complete||r(a,d.errorClass)||!r(a,d.lazyClass))&&(b=v(a,\"lazyunveilread\").detail,f&&E.updateElem(a,!0,a.offsetWidth),a._lazyRace=!0,Q++,aa(a,b,f,e,c))}},ca=C(function(){d.loadMode=3,W()}),da=function(){3==d.loadMode&&(d.loadMode=2),ca()},ea=function(){if(!m){if(f.now()-y<999)return void k(ea,999);m=!0,d.loadMode=3,W(),j(\"scroll\",da,!0)}};return{_:function(){y=f.now(),c.elements=b.getElementsByClassName(d.lazyClass),g=b.getElementsByClassName(d.lazyClass+\" \"+d.preloadClass),j(\"scroll\",W,!0),j(\"resize\",W,!0),j(\"pageshow\",function(a){if(a.persisted){var c=b.querySelectorAll(\".\"+d.loadingClass);c.length&&c.forEach&&l(function(){c.forEach(function(a){a.complete&&ba(a)})})}}),a.MutationObserver?new MutationObserver(W).observe(e,{childList:!0,subtree:!0,attributes:!0}):(e[h](\"DOMNodeInserted\",W,!0),e[h](\"DOMAttrModified\",W,!0),setInterval(W,999)),j(\"hashchange\",W,!0),[\"focus\",\"mouseover\",\"click\",\"load\",\"transitionend\",\"animationend\"].forEach(function(a){b[h](a,W,!0)}),\/d$|^c\/.test(b.readyState)?ea():(j(\"load\",ea),b[h](\"DOMContentLoaded\",W),k(ea,2e4)),c.elements.length?(V(),z._lsFlush()):W()},checkElems:W,unveil:ba,_aLSL:da}}(),E=function(){var a,c=A(function(a,b,c,d){var e,f,g;if(a._lazysizesWidth=d,d+=\"px\",a.setAttribute(\"sizes\",d),n.test(b.nodeName||\"\"))for(e=b.getElementsByTagName(\"source\"),f=0,g=e.length;f<g;f++)e[f].setAttribute(\"sizes\",d);c.detail.dataAttr||w(a,c.detail)}),e=function(a,b,d){var e,f=a.parentNode;f&&(d=y(a,f,d),e=v(a,\"lazybeforesizes\",{width:d,dataAttr:!!b}),e.defaultPrevented||(d=e.detail.width)&&d!==a._lazysizesWidth&&c(a,f,e,d))},f=function(){var b,c=a.length;if(c)for(b=0;b<c;b++)e(a[b])},g=C(f);return{_:function(){a=b.getElementsByClassName(d.autosizesClass),j(\"resize\",g)},checkElems:g,updateElem:e}}(),F=function(){!F.i&&b.getElementsByClassName&&(F.i=!0,E._(),D._())};return k(function(){d.init&&F()}),c={cfg:d,autoSizer:E,loader:D,init:F,uP:w,aC:s,rC:t,hC:r,fire:v,gW:y,rAF:z}});\n\n\/*******\n\/include\/script\/lite-yt-embed.js\n*********\/\n\/**\n \n * A lightweight youtube embed. Still should feel the same to the user, just MUCH faster to initialize and paint.\n \n *\n \n * Thx to these as the inspiration\n \n *   https:\/\/storage.googleapis.com\/amp-vs-non-amp\/youtube-lazy.html\n \n *   https:\/\/autoplay-youtube-player.glitch.me\/\n \n *\n \n * Once built it, I also found these:\n \n *   https:\/\/github.com\/ampproject\/amphtml\/blob\/master\/extensions\/amp-youtube (\ud83d\udc4d\ud83d\udc4d)\n \n *   https:\/\/github.com\/Daugilas\/lazyYT\n \n *   https:\/\/github.com\/vb\/lazyframe\n \n *\/\n\nclass LiteYTEmbed extends HTMLElement {\n\n    connectedCallback() {\n\n        this.classList.add('hosted-video');\n\n        const editor = $(this).parents(\".eos-editor:first\");\n\n        if (editor.length) {\n            return;\n        }\n\n        this.videoId = this.getAttribute('videoid');\n        this.seriesid = this.getAttribute('seriesid');\n        this.videopath = this.getAttribute('videopath');\n\n\n        let playBtnEl = this.querySelector('.lty-playbtn');\n\n        \/\/ A label for the button takes priority over a [playlabel] attribute on the custom-element\n\n        this.playLabel = (playBtnEl && playBtnEl.textContent.trim()) || this.getAttribute('playlabel') || 'Play';\n\n\n        this.dataset.title = this.getAttribute('title') || \"\";\n\n\n        \/**\n         \n         * Lo, the youtube poster image!  (aka the thumbnail, image placeholder, etc)\n         \n         *\n         \n         * See https:\/\/github.com\/paulirish\/lite-youtube-embed\/blob\/master\/youtube-thumbnail-urls.md\n         \n         *\/\n\n        if (!this.style.backgroundImage && !editor.length) {\n            this.style.backgroundImage = `url(\"https:\/\/i.ytimg.com\/vi\/${this.videoId}\/hqdefault.jpg\")`;\n            this.upgradePosterImage();\n        }\n\n\n        \/\/ Set up play button, and its visually hidden label\n\n        if (!playBtnEl) {\n\n            playBtnEl = document.createElement('button');\n\n            playBtnEl.type = 'button';\n\n            playBtnEl.classList.add('lty-playbtn');\n\n            this.append(playBtnEl);\n\n        }\n\n        if (!playBtnEl.textContent) {\n\n            const playBtnLabelEl = document.createElement('span');\n\n            playBtnLabelEl.className = 'lyt-visually-hidden';\n\n            playBtnLabelEl.textContent = this.playLabel;\n\n            playBtnEl.append(playBtnLabelEl);\n\n        }\n\n\n        this.addNoscriptIframe();\n\n\n        playBtnEl.setAttribute(\"href\", \"#\");\n\n\n        \/\/ On hover (or tap), warm up the TCP connections we're (likely) about to use.\n        if (!this.videopath) {\n            this.addEventListener('pointerover', LiteYTEmbed.warmConnections, {once: true});\n        }\n\n\n        \/\/ Once the user clicks, add the real iframe and drop our play button\n\n        \/\/ TODO: In the future we could be like amp-youtube and silently swap in the iframe during idle time\n\n        \/\/   We'd want to only do this for in-viewport or near-viewport ones: https:\/\/github.com\/ampproject\/amphtml\/pull\/5003\n\n        this.addEventListener('click', this.activate);\n\n\n        \/\/ Chrome & Edge desktop have no problem with the basic YouTube Embed with ?autoplay=1\n\n        \/\/ However Safari desktop and most\/all mobile browsers do not successfully track the user gesture of clicking through the creation\/loading of the iframe,\n\n        \/\/ so they don't autoplay automatically. Instead we must load an additional 2 sequential JS files (1KB + 165KB) (un-br) for the YT Player API\n\n        \/\/ TODO: Try loading the the YT API in parallel with our iframe and then attaching\/playing it. #82\n\n        this.needsYTApi = this.hasAttribute(\"js-api\") || navigator.vendor.includes('Apple') || navigator.userAgent.includes('Mobi');\n\n    }\n\n    \/**\n     \n     * Add a <link rel={preload | preconnect} ...> to the head\n     \n     *\/\n\n    static addPrefetch(kind, url, as) {\n\n        const linkEl = document.createElement('link');\n\n        linkEl.rel = kind;\n\n        linkEl.href = url;\n\n        if (as) {\n\n            linkEl.as = as;\n\n        }\n\n        document.head.append(linkEl);\n\n    }\n\n    \/**\n     \n     * Begin pre-connecting to warm up the iframe load\n     \n     * Since the embed's network requests load within its iframe,\n     \n     *   preload\/prefetch'ing them outside the iframe will only cause double-downloads.\n     \n     * So, the best we can do is warm up a few connections to origins that are in the critical path.\n     \n     *\n     \n     * Maybe `<link rel=preload as=document>` would work, but it's unsupported: http:\/\/crbug.com\/593267\n     \n     * But TBH, I don't think it'll happen soon with Site Isolation and split caches adding serious complexity.\n     \n     *\/\n\n    static warmConnections() {\n\n        if (LiteYTEmbed.preconnected)\n            return;\n\n\n        \/\/ The iframe document and most of its subresources come right off youtube.com\n\n        LiteYTEmbed.addPrefetch('preconnect', 'https:\/\/www.youtube-nocookie.com');\n\n        \/\/ The botguard script is fetched off from google.com\n\n        LiteYTEmbed.addPrefetch('preconnect', 'https:\/\/www.google.com');\n\n\n        \/\/ Not certain if these ad related domains are in the critical path. Could verify with domain-specific throttling.\n\n        LiteYTEmbed.addPrefetch('preconnect', 'https:\/\/googleads.g.doubleclick.net');\n\n        LiteYTEmbed.addPrefetch('preconnect', 'https:\/\/static.doubleclick.net');\n\n\n        LiteYTEmbed.preconnected = true;\n\n    }\n\n    fetchYTPlayerApi() {\n\n        if (window.YT || (window.YT && window.YT.Player))\n            return;\n\n\n        this.ytApiPromise = new Promise((res, rej) => {\n\n            var el = document.createElement('script');\n\n            el.src = 'https:\/\/www.youtube.com\/iframe_api';\n\n            el.async = true;\n\n            el.onload = _ => {\n\n                YT.ready(res);\n\n            };\n\n            el.onerror = rej;\n\n            this.append(el);\n\n        });\n\n    }\n\n    \/** Return the YT Player API instance. (Public L-YT-E API) *\/\n\n    async getYTPlayer() {\n\n        if (!this.playerPromise) {\n\n            await this.activate();\n\n        }\n\n\n        return this.playerPromise;\n\n    }\n\n    async addYTPlayerIframe() {\n\n        this.fetchYTPlayerApi();\n\n        await this.ytApiPromise;\n\n\n        const videoPlaceholderEl = document.createElement('div')\n\n        this.append(videoPlaceholderEl);\n\n\n        const paramsObj = Object.fromEntries(this.getParams().entries());\n\n\n        this.playerPromise = new Promise(resolve => {\n\n            let player = new YT.Player(videoPlaceholderEl, {\n\n                width: '100%',\n\n                videoId: this.videoId,\n\n                playerVars: paramsObj,\n\n                events: {\n\n                    'onReady': event => {\n\n                        event.target.playVideo();\n\n                        resolve(player);\n\n                    }\n\n                }\n\n            });\n\n        });\n\n    }\n\n    \/\/ Add the iframe within <noscript> for indexability discoverability. See https:\/\/github.com\/paulirish\/lite-youtube-embed\/issues\/105\n\n    addNoscriptIframe() {\n\n        const iframeEl = this.createBasicIframe();\n\n        const noscriptEl = document.createElement('noscript');\n\n        \/\/ Appending into noscript isn't equivalant for mysterious reasons: https:\/\/html.spec.whatwg.org\/multipage\/scripting.html#the-noscript-element\n\n        noscriptEl.innerHTML = iframeEl.outerHTML;\n\n        this.append(noscriptEl);\n\n    }\n\n    getParams() {\n\n        const params = new URLSearchParams(this.getAttribute('params') || []);\n\n        params.append('autoplay', '1');\n\n        params.append('playsinline', '1');\n\n        return params;\n\n    }\n\n    async activate() {\n\n        if (this.classList.contains('lyt-activated'))\n            return;\n\n        this.classList.add('lyt-activated');\n\n        if (this.videopath) {\n\n            const video = $(\"<video controls><\/video>\");\n\n            video[0].src = this.videopath;\n\n            this.append(video[0]);\n            video[0].play();\n\n            return;\n        }\n\n\n        if (this.needsYTApi) {\n\n            return this.addYTPlayerIframe(this.getParams());\n\n        }\n\n\n        const iframeEl = this.createBasicIframe();\n\n        this.append(iframeEl);\n\n\n        \/\/ Set focus for a11y\n\n        iframeEl.focus();\n\n    }\n\n    createBasicIframe() {\n\n        const iframeEl = document.createElement('iframe');\n\n        iframeEl.width = 560;\n\n        iframeEl.height = 315;\n\n        \/\/ No encoding necessary as [title] is safe. https:\/\/cheatsheetseries.owasp.org\/cheatsheets\/Cross_Site_Scripting_Prevention_Cheat_Sheet.html#:~:text=Safe%20HTML%20Attributes%20include\n\n        iframeEl.title = this.playLabel;\n\n        iframeEl.allow = 'accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture';\n\n        iframeEl.allowFullscreen = true;\n\n        \/\/ AFAIK, the encoding here isn't necessary for XSS, but we'll do it only because this is a URL\n\n        \/\/ https:\/\/stackoverflow.com\/q\/64959723\/89484\n\n        iframeEl.src = `https:\/\/www.youtube-nocookie.com\/embed\/${encodeURIComponent(this.videoId)}?${this.getParams().toString()}`;\n\n        return iframeEl;\n\n    }\n\n    \/**\n     \n     * In the spirit of the `lowsrc` attribute and progressive JPEGs, we'll upgrade the reliable\n     \n     * poster image to a higher resolution one, if it's available.\n     \n     * Interestingly this sddefault webp is often smaller in filesize, but we will still attempt it second\n     \n     * because getting _an_ image in front of the user if our first priority.\n     \n     *\n     \n     * See https:\/\/github.com\/paulirish\/lite-youtube-embed\/blob\/master\/youtube-thumbnail-urls.md for more details\n     \n     *\/\n\n    upgradePosterImage() {\n\n        \/\/ Defer to reduce network contention.\n\n        setTimeout(() => {\n\n            const webpUrl = `https:\/\/i.ytimg.com\/vi_webp\/${this.videoId}\/sddefault.webp`;\n\n            const img = new Image();\n\n            img.fetchPriority = 'low'; \/\/ low priority to reduce network contention\n\n            img.referrerpolicy = 'origin'; \/\/ Not 100% sure it's needed, but https:\/\/github.com\/ampproject\/amphtml\/pull\/3940\n\n            img.src = webpUrl;\n\n            img.onload = e => {\n\n                \/\/ A pretty ugly hack since onerror won't fire on YouTube image 404. This is (probably) due to\n\n                \/\/ Youtube's style of returning data even with a 404 status. That data is a 120x90 placeholder image.\n\n                \/\/ \u2026 per \"annoying yt 404 behavior\" in the .md\n\n                const noAvailablePoster = e.target.naturalHeight === 90 && e.target.naturalWidth === 120;\n\n                if (noAvailablePoster)\n                    return;\n\n\n                this.style.backgroundImage = `url(\"${webpUrl}\")`;\n\n            };\n\n        }, 100);\n\n    }\n\n}\n;\n\n\/\/ Register custom element\n\ncustomElements.define('lite-youtube', LiteYTEmbed);\n\n\/*******\n\/cookies\/script\/public\/popup\n*********\/\n$(document).ready(function () {\n\n    const container = $(\"#cookie-compliance\");\n\n\/*\n    container.removeClass(\"hidden\");\n    const dh = container.height();\n    container.css({\n        height: \"0px\"\n    });\n\n    setTimeout(function () {\n        $(\"#cookie-compliance\").animate({\"height\": dh}, 200);\n    }, 500);*\/\n\n    container.find(\".mod_cookies\").on(\"saved\", function () {\n\n        const prefs = container.find(\".preferences\");\n\n        if (prefs.attr(\"data-show-saved\")) {\n            container.find(\".saved-mask\").removeClass(\"hidden\");\n            $(this).addClass(\"hidden\");\n            setTimeout(function () {\n                container.animate({\n                    height: \"0px\"\n                }, 200);\n            }, 1000);\n        } else {\n            container.animate({\n                height: \"0px\"\n            }, 200);\n        }\n    });\n\n});\n\n\/*******\n\/layout\/script\/public\/slaved\n*********\/\n$(document).ready(function () {\n\n    $(document).find(\"form\").on(\"submit\", function () {\n\n        if($(this).hasClass(\"smart-search\")){\n            return;\n        }\n\n        var open = [];\n        \n        \/\/console.log($(\".slaved\"));\n        \n        $(\".slaved\").each(function () {\n            if ($(this).hasClass(\"open\")) {\n                open[open.length] = $(this).attr(\"data-cell-id\");\n            }\n        });\n\n        open = JSON.stringify(open);\n\n        $(this).append(\"<input type='hidden' name='layout-slaves-open' value='\" + open + \"'\/>\");\n\n    });\n\n    $(\".slaved\").each(function () {\n        \n        var context = null;\n        \n        if($(this).parents(\".iteration:first\").length){\n            context = $(this).parents(\".iteration:first\");\n        }\n                \n        var scid = $(this).attr(\"data-slaved\");\n        var slave = $(this);\n        var toggle = $(\"[data-cid='\" + scid + \"']\", context);\n        \n        toggle.css({\n            cursor: \"pointer\"\n        });\n        \n        if(slave.hasClass(\"open\")){\n            toggle.addClass(\"active\");\n        }\n        \n        toggle.addClass(\"slave-toggle\");\n        \n        toggle.off(\"click\").on(\"click\", function (e) {\n            $(\".slave-toggle\").removeClass(\"active\");\n            if (slave.hasClass(\"open\")) {\n                slave.toggleClass(\"open\");\n            } else {\n                $(\".slaved.open\").removeClass(\"open\");\n                slave.toggleClass(\"open\");\n                $(this).addClass(\"active\");\n            }\n        });\n\n        $(\".slave-close\").off(\"click\").on(\"click\", function (e) {\n            $(\".slaved.open\").removeClass(\"open\");\n            slave.removeClass(\"open\");\n            $(\".slave-toggle\").removeClass(\"active\");\n        });\n    });\n});\n\n\n\/*******\n\/layout\/script\/public\/tabs\n*********\/\n$(document).ready(function () {\n\n    var init = function () {\n        $(\".lm-tab-controlled:not(.initialised)\").each(function () {\n            $(this).addClass(\"initialised\");\n            var container = $(this).parent();\n            if (!container.children(\".tab-container\").length) {\n                container.prepend(\"<div class='tab-container'><\/div>\");\n            }\n\n            if (container.find(\".lm-tab[data-tab-name='\" + $(this).attr(\"data-tab-name\") + \"']\").length) {\n                return;\n            }\n\n            var b = $(\"<button class='lm-tab' data-tab-name='\" + $(this).attr(\"data-tab-name\") + \"' data-url='\" + $(this).attr(\"data-tab-url\") + \"'>\" + $(this).attr(\"data-tab-name\") + \"<\/button>\");\n            container.children(\".tab-container\").append(b);\n        });\n\n        $(\".tab-container:not(.initialised)\").each(function () {\n            $(this).addClass(\"initialised\");\n\n            if ($(this).children(\".lm-tab\").length < 2) {\n                $(this).addClass(\"hidden\");\n            }\n\n            var container = $(this).parent();\n            $(this).find(\"button:first\").addClass(\"active\");\n            $(this).children(\"button\").each(function () {\n                container.find(\".lm-tab-controlled[data-tab-name='\" + $(this).attr(\"data-tab-name\") + \"']\").wrapAll(\"<div class='lm-tab-wrapped' data-tab-name='\" + $(this).attr(\"data-tab-name\") + \"' id='\" + $(this).attr(\"data-tab-name\") + \"-tab' \/>\");\n            });\n            container.children(\".lm-tab-wrapped:not(:first)\").addClass(\"hidden\");\n            container.children(\".lm-tab-wrapped:first\").addClass(\"active-tab\");\n        });\n\n        $(\"button.lm-tab:not(.initialised)\").each(function () {\n            $(this).addClass(\"initialised\");\n            $(this).on(\"click\", function (e, args) {\n                e.preventDefault();\n                var button = $(this);\n\n                var container = $(this).parent().parent();\/\/I don't like this, but not sure where it should stop, else it won't work with nested tabs\n                var tab = container.find(\".lm-tab-wrapped[data-tab-name='\" + $(this).attr(\"data-tab-name\") + \"']\");\n\n                var active_tab = container.find(\".lm-tab.active\");\n                var active_content = container.children(\".lm-tab-wrapped.active-tab\");\n\n                var active_index = active_tab.index();\n                var my_index = $(this).index();\n\n                var prev_trigger = $(this).prev();\n\n                if (active_index !== my_index) {\n\n                    \/\/var prev_tab = container.find(\".lm-tab-wrapped[data-tab-name='\" + prev_trigger.attr(\"data-tab-name\") + \"']\");\n                    try {\n                        let cancelled = false;\n                        active_tab.trigger(\"tab-closing\", {\n                            \/\/\"selected\": container.find(\".lm-tab-wrapped[data-tab-name='\" + prev_trigger.attr(\"data-tab-name\") + \"']\"),\n                            selected: active_tab,\n                            \"throw\": true,\n                            \"cancel\": function () {\n                                \/\/prev_trigger.trigger(\"click\");\n                                active_tab.trigger(\"click\");\n                                cancelled = true;\n                            }\n                        });\n                        if (cancelled) {\n                            return;\n                        }\n                    } catch (e) {\n                        \/\/prev_trigger.trigger(\"click\");\n                        active_tab.trigger(\"click\");\n                        return;\n                    }\n                }\n\n                let error_tab = null;\n\n                try {\n                    if (active_index < my_index) {\/\/don't trigger when going backwards\n\n                        var nocloseevent = false;\n                        \n                        if (args) {\n                            if (args.nocloseevent) {\n                                nocloseevent = true;\n                            }\n                        }\n\n                        if (!nocloseevent) {\n                            active_content.trigger(\"tab-content-closing\");\n                            let cancelled = false;\n                            \/\/Trigger is not async it seems - handy\n\n                            \/\/trigger close on all tabs between active and clicked tab\n                            const affected_tabs = [];\n\n                            const all_tabs = container.find(\".lm-tab-wrapped\");\n                            all_tabs.each(function () {\n                                const tab_index = $(this).index() - 1;\n                                if (tab_index >= active_index && tab_index < my_index) {\n                                    affected_tabs[affected_tabs.length] = $(this);\n                                }\n                            });\n\n                            $.each(affected_tabs, function () {\n                                const af = this;\n                                error_tab = this;\n                                cancelled = false;\n                                container.parents(\"form\").trigger(\"tab-closing\", {\n                                    \/\/selected: container.find(\".lm-tab-wrapped[data-tab-name='\" + active_tab.attr(\"data-tab-name\") + \"']\"),\n                                    selected: af,\n                                    \"cancel\": function () {\n                                        const tab_trigger = container.find(\".lm-tab[data-tab-name='\" + af.attr(\"data-tab-name\") + \"']\");\n                                        tab_trigger.trigger(\"click\");\n                                        cancelled = true;\n                                    }\n                                });\n                                if (cancelled) {\n                                    return -1;\n                                }\n                            });\n\n                            if (cancelled) {\n                                return;\n                            }\n                        }\n                        \/\/actab.trigger(\"tab-opened\", {selected: actab});\n                    }\n                } catch (e) {\n\n                    if (error_tab) {\n                        container.find(\".lm-tab[data-tab-name='\" + error_tab.attr(\"data-tab-name\") + \"']\").trigger(\"click\", {nocloseevent: true});\n                    }\n\n                    if (args) {\/\/should be args.return_exception, but I can't remember where all the calling functions are to update them!\n                        throw e;\n                    }\n\n                    return;\n                }\n\n                if (tab.data(\"check-tab-ready\")) {\n                    tab.data(\"check-tab-ready\")({\n                        \"ready\": function (callback) {\n                            container.children(\".lm-tab-wrapped\").addClass(\"hidden\");\n                            container.children(\".lm-tab-wrapped\").removeClass(\"active-tab\");\n                            button.parent().children(\"a\").removeClass(\"active\");\n                            button.addClass(\"active\");\n                            tab.addClass(\"active-tab\");\n                            tab.removeClass(\"hidden\");\n                            tab.trigger(\"tab-opened\");\n                            container.parents(\".layout:first\").trigger(\"any-tab-opened\");\n\n                            var mcoffset = $(\".main-content\").offset().top;\n                            \/\/mcoffset = 0;\n                            \n                            \/\/console.log(mcoffset);\n                            \/\/console.log(tab.offset().top);\n\n                            let scroll_pos = (tab.offset().top - mcoffset) - tab.height();\n                            \/\/scroll_pos = 10;\n\n                            $([document.documentElement, document.body]).animate({\n                                scrollTop: scroll_pos\n                            }, 200);\n\n                            if (callback) {\n                                callback();\n                            }\n                        }\n                    });\n                } else {\n                    container.children(\".lm-tab-wrapped\").addClass(\"hidden\");\n                    container.children(\".lm-tab-wrapped\").removeClass(\"active-tab\");\n                    button.parent().children(\"button\").removeClass(\"active\");\n                    button.addClass(\"active\");\n                    tab.removeClass(\"hidden\");\n                    tab.addClass(\"active-tab\");\n                    tab.trigger(\"tab-opened\");\n                    container.parents(\".layout:first\").trigger(\"any-tab-opened\");\n                }\n            });\n        });\n    };\n\n    init();\n\n    var url_tab = $.get_parameter(\"tab\");\n\n    if (url_tab) {\n        $(\".lm-tab[data-tab-name='\" + url_tab + \"']\").trigger(\"click\", {nocloseevent: true});\n    } else {\n\n        var parts = document.location.pathname.split(\"\/\");\n\n        $.each(parts, function () {\n\n            if (!this.length) {\n                return;\n            }\n\n            var tab = $(\"button.lm-tab[data-url='\" + this + \"']\");\n\n            if (tab.length) {\n                var container = tab.parent().parent().find(\".tab-container:first\");\n                container.find(\".lm-tab[data-tab-name='\" + tab.attr(\"data-tab-name\") + \"']\").trigger(\"click\", {nocloseevent: true});\n            }\n\n        });\n    }\n\n    $(document).on(\"refresh-tabs\", function () {\n        init();\n    });\n\n});\n\n\/*******\n\/include\/script\/serialise.js\n*********\/\n\/**\n \n Copyright Watman & Worth Web Ltd 2016\n \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and\/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n \n Author: \n William Worth 14\/12\/2015\n debug@e-os.co.uk\n \n I wrote this script as a direct replacement for form2js by Maxim Vasiliev \n as I was unable to modify his script to play nicely with input names like test[123][]\n \n \n input, select and textarea are all supported.\n \n form inputs in the following styles are all supported\n <input name='test' value='ignition' \/>\n <input name='test[]' value='ignition' \/> \n <input name='test[member]' value='ignition' \/>\n <input name='test.member' value='ignition' \/>\n <input name='test.member[]' value='ignition' \/>\n <input name='test.member[123]' value='ignition' \/>\n <input name='test[mixed].member[123]' value='ignition' \/>\n \n <input name='test.member' value='ignition' \/>\n and\n <input name='test[member]' value='ignition' \/>\n will produce the same output\n \n test {\n member: \"ignition\"\n }\n \n \n usage:\n \n var obj = $(selector).serializeObject({options});\n \n **\/\n\n(function () {\n    $.fn.serializeObject = function (options) {\n\n        var options = $.extend({\n            delimiter: \".\",\n            \"include-unchecked\": false, \/\/include unchecked checkboxes\n            \"include-disabled\": false\n        }, options);\n\n        var elements = $(this).find(\"input,textarea,select\");\n\n        var output = {};\n\n        var build_output = function (name, value, element) {\n\n            if (!name) {\n                return;\n            }\n\n            var name_parts = name.split(options.delimiter);            \n            var name_chain = [];\n            var tref = output;\n\n            $(name_parts).each(function () {\n\n                var np = this.substr(0, this.indexOf(\"[\"));\n                if (!np) {\n                    name_chain[name_chain.length] = this.toString();\n                } else {\n                    var panic = 0;\n                    var part = this;\n\n                    name_chain[name_chain.length] = part.substr(0, part.indexOf(\"[\"));\n                    part = part.substr(part.indexOf(\"[\"));\n\n                    while (part.indexOf(\"[\") !== -1) {\n                        var part_name = part.substr(part.indexOf(\"[\") + 1, part.indexOf(\"]\") - 1);\n                        if (!part_name.length) {\/\/auto-indexed member name, ie test[] = \"one\"\n                            name_chain[name_chain.length] = [];\n                        } else {\n                            name_chain[name_chain.length] = part_name;\n                        }\n                        part = part.substr(part.indexOf(\"]\") + 1);\n                        panic++;\n                        if (panic > 100) {\n                            console.log(\"Maximum nesting level exceeded - malformed input name? '\" + name + \"'\");\n                            console.log(element);\n                            break;\n                        }\n                    }\n                }\n            });\n\n            var chain_len = name_chain.length;\n\n            \/\/loop through the name chain and build the output object one level at a time and increment the reference\n\n            $(name_chain).each(function (index, element) {\n                if (index === (chain_len - 1)) {\/\/last name in chain\n                    if (typeof (element) === \"object\") {\/\/auto-indexed array\n                        tref[tref.length] = value;\n                    } else {\n                        tref[this] = value;\n                    }\n                } else {\n                    if (!tref[this]) {\n                        if (typeof name_chain[index + 1] === \"object\") {\n                            tref[this] = [];\n                        } else {\n                            tref[this] = {};\n                        }\n                    }\n                    \/\/assign tref as a reference to the last element in the object collection ready for the next pass\n                    tref = tref[this];\n                }\n            });\n        };\n\n        $(elements).each(function () {\n\n            \/\/console.log(this.tagName.toLowerCase());\n            if ($(this).prop(\"disabled\")) {\n                return;\n            }\n\n            switch (this.tagName.toLowerCase()) {\n                case \"input\":\n                    var itype = $(this).attr(\"type\");\n                    if (itype) {\n                        itype = itype.toLowerCase();\n                    }\n                    switch (itype) {\n                        case \"radio\":\n                            $(this).each(function () {\n                                if ($(this).prop(\"checked\")) {\n                                    build_output($(this).attr(\"name\"), $(this).attr(\"value\"));\n                                }\n                            });\n                            break;\n                        case \"checkbox\":\n                            $(this).each(function () {\n\n                                if ($(this).prop(\"disabled\") && !options[\"include-disabled\"]) {\n                                    return;\n                                }\n\n                                if ($(this).prop(\"checked\")) {\n                                    build_output($(this).attr(\"name\"), $(this).attr(\"value\"));\n                                } else if (options[\"include-unchecked\"]) {\n                                    build_output($(this).attr(\"name\"), null);\n                                }\n                            });\n                            break;\n\n\n                        default:\n                            build_output($(this).attr(\"name\"), $(this).val(), this);\n                    }\n                    break;\n\n                default:\n                    build_output($(this).attr(\"name\"), $(this).val());\n            }\n        });\n\n        return output;\n    };\n\n})(jQuery);\n\n\/*******\n\/cookies\/script\/public\/preferences\/accept-all\n*********\/\n$(document).ready(function () {\n\n    $(\".layout.mod_cookies\").each(function () {\n\n        const container = $(this);\n\n        container.find(\".button.accept-all\").on(\"click\", function (e) {\n            e.preventDefault();\n\n            if (typeof gtag === \"function\") {\n                gtag('consent', 'update', {\n                    'ad_user_data': 'granted',\n                    'ad_personalization': 'granted',\n                    'ad_storage': 'granted',\n                    'analytics_storage': 'granted'\n                });\n            }\n\n            container.find(\"input[type='checkbox']:not(.disabled)\").prop(\"checked\", true);\n            const query = container.serializeObject();\n\n            $.post($(this).attr(\"data-api-path\"), query, function (data) {\n                if (data !== \"OK\") {\n                    $.eosmsg(data);\n                } else {\n                    container.trigger(\"saved\");\n                }\n            });\n        });\n    });\n\n});\n\n\/*******\n\/cookies\/script\/public\/preferences\/save-choices\n*********\/\n$(document).ready(function () {\n\n    $(\".layout.mod_cookies\").each(function () {\n\n        const container = $(this);\n\n        container.find(\".button.save\").on(\"click\", function (e) {\n            e.preventDefault();\n\n            const query = container.serializeObject();\n\n            let analytics = \"denied\";\n\n            if (query.__analytics && query.__analytics === \"yes\") {\n                analytics = \"granted\";\n            }\n\n            if (typeof gtag === \"function\") {\n                gtag('consent', 'update', {\n                    'ad_user_data': 'denied',\n                    'ad_personalization': 'denied',\n                    'ad_storage': 'denied',\n                    'analytics_storage': analytics\n                });\n            }\n\n            $.post($(this).attr(\"data-api-path\"), query, function (data) {\n                if (data !== \"OK\") {\n                    $.eosmsg(data);\n                } else {\n                    container.trigger(\"saved\");\n                }\n            });\n        });\n    });\n\n});\n\n\/*******\n\/cookies\/script\/public\/preferences\/refuse-all\n*********\/\n$(document).ready(function () {\n\n    $(\".layout.mod_cookies\").each(function () {\n\n        const container = $(this);\n\n        container.find(\".button.refuse-all\").on(\"click\", function (e) {\n            e.preventDefault();\n\n            if (typeof gtag === \"function\") {\n                gtag('consent', 'update', {\n                    'ad_user_data': 'denied',\n                    'ad_personalization': 'denied',\n                    'ad_storage': 'denied',\n                    'analytics_storage': 'denied'\n                });\n            }\n\n            container.find(\"input[type='checkbox']:not(.disabled)\").prop(\"checked\", false);\n            const query = container.serializeObject();\n\n            $.post($(this).attr(\"data-api-path\"), query, function (data) {\n                if (data !== \"OK\") {\n                    $.eosmsg(data);\n                } else {\n                    container.trigger(\"saved\");\n                }\n            });\n        });\n    });\n\n});\n\n\/*******\n\/mod-warning\/script\/public\/index\n*********\/\n$(document).ready(function () {\n\n    let warnings = {};\n\n    try {\n        warnings = $.parseJSON($(\"#mod-warning-warnings\").text());\n\n        $.each(warnings, function () {\n            if (this.def[\"bg-image\"]) {\n                const img = $(\"<img\/>\");\n                img.attr(\"src\", this.def[\"bg-image\"]);\/\/make sure background images for the styles are pre-loaded\n            }\n        });\n\n    } catch (e) {\n    }\n\n    $(\".mod-warning-warning\").find(\".button.close\").on(\"click\", function (e) {\n        e.preventDefault();\n        $(this).parents(\".mod-warning-warning\").remove();\n        $(\".mod-warning-mask\").remove();\n    });\n\n    (function ($) {\n        $.extend({\n            addpopupwarnings: function (pwarnings) {\n                $.each(pwarnings, function (i, v) {\n                    warnings[i] = v;\n                });\n            }});\n    })(jQuery);\n\n    (function ($) {\n        $.extend({\n            triggerwarning: function (options, fail) {\n\n                if (!options) {\n                    options = {};\n                }\n\n                if (!options.key) {\n                    return;\n                }\n\n                const warning = warnings[options.key];\n\n                if (!warning || !warning.def) {\n                    if (fail) {\n                        fail();\n                    }\n                    return;\n                }\n\n                var ddiv = $(\"<div class='mod-warning-wrapper'\/>\");\n\n                \/\/console.log(warning);\n\n                let msg = warning.def.message;\n\n                if (!msg) {\n                    msg = warning.default;\n                }\n\n                if (warning.def.override) {\n                    msg = warning.def.override;\n                }\n\n                if (options.msg) {\n                    msg = options.msg;\n                }\n\n                \/\/console.log(warning.def);\n\n                let close = \"\";\n\n                if (parseInt(warning.def[\"show-close\"])) {\n                    close = \"<a href='' class='button close'>X<\/a>\";\n                }\n\n                const mdiv = $(\"<div class='mod-warning-warning \" + warning.def.style + \"'>\" + close + \"<\/div>\");\n\n                if (!parseInt(warning.def[\"hide-text\"])) {\n                    mdiv.append(\"<div class='message'>\" + msg + \"<\/div>\");\n                }\n\n                ddiv.append(mdiv);\n\n\n                ddiv.find(\".button.close\").on(\"click\", function (e) {\n                    e.preventDefault();\n                    $(this).parents(\".mod-warning-warning\").remove();\n                    $(\".mod-warning-mask\").remove();\n                });\n\n                const mask = $(\"<div class='mod-warning-mask'><\/div>\");\n\n                if (options.container) {\n                    options.container.append(mask);\n                    options.container.append(ddiv);\n                } else {\n                    mask.appendTo(\"body\");\n                    ddiv.appendTo(\"body\");\n                }\n\n                const width = ddiv.find(\".mod-warning-warning\").width();\n                const height = ddiv.find(\".mod-warning-warning\").height();\n\n                switch (warning.def.position) {\n                    case \"left\":\n                        ddiv.css({\n                            position: \"absolute\",\n                            left: \"0\",\n                            top: \"50%\"\n                        });\n                        break;\n\n                    case \"centre\":\n                        ddiv.css({\n                            position: \"fixed\",\n                            left: \"50%\",\n                            top: \"50%\",\n                            transform: \"translate(-50%, -50%)\"\n                        });\n                        break;\n\n                    default:\n                        ddiv.css({\n                            position: \"absolute\",\n                            left: \"50%\",\n                            \"margin-left\": (-(width \/ 2)) + \"px\",\n                            top: ($(document).scrollTop() + 25) + \"px\"\n                        });\n                }\n\n\n                const duration = parseInt(warning.def.duration);\n\n                if (duration) {\n                    setTimeout(function () {\n                        ddiv.remove();\n                        $(\".mod-warning-mask\").remove();\n                    }, duration * 1000);\n                }\n\n                if (options.onload) {\n                    options.onload(ddiv);\n                }\n            }\n        });\n\n\n    })(jQuery);\n\n});\n\n\/*******\n\/form\/script\/public\/text-field\n*********\/\n$(document).ready(function () {\n\n    const init = function () {\n\n        $(\".layout-component.text-field:not(.tfi)\").each(function () {\n            var component = $(this);\n            $(this).addClass(\"tfi\");\n\n            if (component.attr(\"data-api-validate\")) {\n\n\n                $(this).data({\n                    validate: function () {\n                        if (!component.hasClass(\"valid-reference\")) {\n                            return false;\n                        } else {\n                            return true;\n                        }\n                    }\n                });\n\n                let timeout = null;\n                const input = component.find(\"input\");\n\n                input.on(\"input\", function () {\n\n                    if (timeout) {\n                        clearTimeout(timeout);\n                    }\n\n                    input.addClass(\"error\");\n                    component.removeClass(\"valid-reference\");\n\n                    timeout = setTimeout(function () {\n                        const val = input.val().toString();\n                        if (val.length >= 2) {\n                            const query = {\n                                str: val\n                            };\n                            $.post(component.attr(\"data-api-path\") + \"api-validate\", query, function (data) {\n                                if (!data.status) {\n                                    $.eosmsg(data);\n                                } else {\n                                    console.log(data);\n                                    if (data.valid !== \"true\") {\n                                        input.addClass(\"error\");\n                                        component.addClass(\"error\");\n                                    } else {\n                                        component.addClass(\"valid-reference\");\n                                        component.removeClass(\"error\");\n                                        input.removeClass(\"error\");\n                                    }\n\n                                }\n                            });\n                        }\n                    }, 300);\n                });\n\n                if (input.val()) {\n                    input.trigger(\"input\");\n                }\n            }\n\n            if (component.attr(\"data-auto-complete\")) {\n\n                let timeout = null;\n                const input = component.find(\"input\");\n\n                const matches = $(\"<div class='form-input-auto-complete hidden'><\/div>\");\n                input.after(matches);\n\n                input.on(\"input\", function () {\n\n                    if (timeout) {\n                        clearTimeout(timeout);\n                    }\n\n                    input.addClass(\"error\");\n                    component.removeClass(\"valid-reference\");\n\n                    timeout = setTimeout(function () {\n                        const val = input.val().toString();\n                        if (val.length >= 4) {\n                            const query = {\n                                str: val\n                            };\n                            $.post(component.attr(\"data-api-path\") + \"auto-complete\", query, function (data) {\n                                if (!data.status) {\n                                    $.eosmsg(data);\n                                } else {\n                                    if (!data.matches) {\n                                        input.addClass(\"error\");\n                                    }\n\n                                    matches.removeClass(\"hidden\");\n                                    matches.html(\"\");\n\n                                    $.each(data.matches, function () {\n\n                                        const pmatch = $(\"<div class='form-ac-match'>\" + this.match + \"<\/div>\");\n\n                                        pmatch.on(\"click\", function () {\n                                            input.val($(this).text());\n                                            component.addClass(\"valid-reference\");\n                                            matches.addClass(\"hidden\");\n                                            return -1;\n                                        });\n\n                                        matches.append(pmatch);\n\n                                        if (parseInt(this[\"exact-match\"])) {\n                                            pmatch.addClass(\"exact-match\");\n\n                                            if (this.match === val) {\n                                                component.addClass(\"valid-reference\");\n                                                input.removeClass(\"error\");\n                                                matches.addClass(\"hidden\");\n                                                return -1;\n                                            }\n                                        }\n                                    });\n                                }\n                            });\n                        }\n                    }, 300);\n                });\n            }\n\n            $(this).find(\".button.auto-gen\").off(\"click\").on(\"click\", function (e) {\n                e.preventDefault();\n                $.get($(this).attr(\"href\"), function (data) {\n                    if (!data.newval) {\n                        alert(data);\n                    } else {\n                        component.find(\"input\").val(data.newval);\n                    }\n                });\n            });\n\n            const input = $(this).find(\"input\");\n\n            if (input.attr(\"data-input-filter\")) {\n                switch (input.attr(\"data-input-filter\")) {\n                    case \"currency\":\n                        input.eosinputcurrency({symbol: $(this).attr(\"data-symbol\")});\n                        break;\n\n                    case \"reference-number\":\n                        input.eosinputreferencenumber({symbol: $(this).attr(\"data-symbol\")});\n                        break;\n                }\n            }\n        });\n\n    };\n\n    init();\n\n    $(document).on(\"content-changed\", function () {\n        init();\n    });\n});\n\n\/*******\n\/form\/script\/public\/email\n*********\/\n$(document).ready(function () {\n\n    $(\".layout-component.form-component.email\").each(function () {\n        const component = $(this);\n        const conf = $(this).find(\"input.confirm\");\n        if (conf.length) {\n\n            const mp = component.find(\"input[data-master='true']\");\n\n            component.data({\n                validate: function () {\n                    if (conf.val() !== mp.val()) {\n                        component.find(\".validate-error\").removeClass(\"hidden\");\n                        return false;\n                    }else {\n                        component.find(\".validate-error\").addClass(\"hidden\");\n                        return true;\n                    }\n                }\n            });\n\n            component.find(\"input\").on(\"input\", function () {\n                if (conf.val() !== mp.val()) {\n                    component.addClass(\"error\");\n                    component.find(\"input\").addClass(\"error\");\n                    component.removeClass(\"complete\");\n                    component.find(\"input\").removeClass(\"complete\");\n                    component.find(\".validate-error\").removeClass(\"hidden\");\n                } else {\n                    component.find(\".validate-error\").addClass(\"hidden\");\n                    component.removeClass(\"error\");\n                    component.find(\"input\").removeClass(\"error\");\n                    component.addClass(\"complete\");\n                    component.find(\"input\").addClass(\"complete\");\n                }\n            });\n\n\n        }\n    });\n\n\n});\n\n\/*******\n\/form\/script\/public\/select\n*********\/\n$(document).ready(function(){\n    $(\".layout-component.select\").each(function(){\n        var container = $(this);\n        if($(this).hasClass(\"searchable\")){\n            \n            container.find(\".option\").on(\"click\", function(){\n                container.find(\".option-search-input\").val($(this).text().trim());\n                container.find(\".data-container\").val($(this).attr(\"data-value\").trim());\n                $(this).parent().addClass(\"hidden\");\n            });\n            \n            $(this).find(\".option-search-input\").on(\"input\", function(){\n                var filter = $(this).val().toLowerCase();\n                \n                container.find(\".option\").addClass(\"hidden\");\n                \n                if(!filter.length){\n                    container.find(\".options\").addClass(\"hidden\");\n                }else {\n                    container.find(\".options\").removeClass(\"hidden\");\n                }\n                \n                container.find(\".option\").each(function(){\n                    if($(this).text().toLowerCase().indexOf(filter) > -1){\n                        $(this).removeClass(\"hidden\");\n                    }\n                });\n            });\n        }\n    });\n});\n\n\/*******\n\/form\/script\/public\/checkbox\n*********\/\n$(document).ready(function () {\n\n    $(\".layout-component.checkbox\").each(function () {\n\n        $(this).find(\".n-a\").on(\"click\", function (e) {\n            var container = $(this).parents(\".multi-select-container\");\n            var input = $(this).parent().find(\"input\");\n            if ($(this).attr(\"data-selected\") === \"true\") {\n                input.val($(this).attr(\"data-value\"));\n                $(this).attr(\"data-selected\", \"false\");\n                input.removeClass(\"disabled\");\n                container.removeClass(\"na-checked\");\n            } else {\n                input.val(\"--n\/a--\");\n                $(this).attr(\"data-selected\", \"true\");\n                input.prop(\"checked\", \"checked\");\n                input.addClass(\"disabled\");\n                container.addClass(\"na-checked\");\n            }\n            input.trigger(\"change\");\n        });\n\n        $(this).find(\".checkbox-value\").each(function () {\n            var container = $(this);\n\n            $(this).children(\"input\").on(\"click\", function (e) {\n                if ($(this).attr(\"data-imutable\")) {\n                    e.preventDefault();\n                    return;\n                }\n                if ($(this).prop(\"checked\")) {\n                    container.addClass(\"checked\");\n                } else {\n                    container.removeClass(\"checked\");\n                }\n            });\n\n            $(this).find(\".csb-input\").on(\"click\", function () {\n                var parent_checkbox = $(this).parents(\".checkbox-value\").find(\"input:first\");\n                if ($(this).prop(\"checked\")) {\n                    parent_checkbox.prop(\"checked\", \"checked\");\n                    container.addClass(\"checked\");\n                } else {\n                    var any_checked = false;\n                    container.find(\".csb-input\").each(function () {\n                        if ($(this).prop(\"checked\")) {\n                            any_checked = true;\n                        }\n                    });\n\n                    if (!any_checked) {\n                        parent_checkbox.prop(\"checked\", false);\n                        container.removeClass(\"checked\");\n                    }\n\n                }\n            });\n        });\n\n        var max_selected = parseInt($(this).attr(\"data-max-selected\"));\n\n\n\n        if (max_selected) {\n            var container = $(this);\n\n            \/\/need it here as well as onclick else pre-selected boxes don't work properly\n            var curr_selected = container.find(\"input:checked\").length;\n            if (curr_selected >= max_selected) {\n                container.find(\"input:not(:checked)\").attr(\"disabled\", \"disabled\");\n            }\n\n            $(this).find(\".checkbox-value\").children(\"input\").on(\"click\", function (e) {\n                var curr_selected = container.find(\"input:checked\").length;\n                if (curr_selected >= max_selected) {\n                    container.find(\"input:not(:checked)\").attr(\"disabled\", \"disabled\");\n                } else if (curr_selected < max_selected) {\n                    container.find(\"input:not(:checked)\").removeAttr(\"disabled\");\n                }\n            });\n        }\n    });\n});\n\n\n\/*******\n\/form\/script\/public\/ajax\n*********\/\n\nvar ddiv = null;\n\nif (typeof arguments != 'undefined') {\n    ddiv = arguments[0];\n}\n\n$(document).ready(function () {\n\n    $(\".layout.mod_form\").each(function () {\n\n        var mfl = $(this);\n\n        if (!mfl.find(\"form\").length) {\n            return;\/\/.layout.mod_form can be nested ( it shouldn't be, but it is! )\n        }\n\n        var config = $(this).find(\".layout-component.main-config\");\n\n        if (config.attr(\"data-ajax\")) {\n            config.parents(\"form:first\").off(\"submit\").on(\"submit\", function (e, args) {\n                e.preventDefault();\n\n                var form = $(this);\n\n                if (form.data(\"submitted\")) {\n                    return;\n                }\n\n                try {\n                    form.trigger(\"validate\", {\n                        throw: true\n                    });\n                } catch (e) {\n                    console.log(e);\n                    return;\n                }\n\n                var query = $(this).serializeObject();\n\n                query.ajax = true;\n\n                if ($(this).data(\"submit-cancel\")) {\n                    query.cancelled = true;\n                }\n\n                $.eosbusy.show();\n\n                $.post($(this).attr(\"action\"), query, function (data) {\n                    $.eosbusy.hide();\n\n                    if (!data.status) {\n                        $.eosmsg(data);\n                        return;\n                    }\n\n                    if (data.status === \"ERROR\") {\n                        if (data.key) {\n                            $.triggerwarning({\n                                key: data.key,\n                                container: form,\n                                msg: data.msg\n                            }, function () {\n                                $.eosmsg(data.msg);\n                            });\n                            return;\n                        }\n                    }\n\n                    if (data.missing) {\n                        if (args) {\n                            if (args.onerror) {\n                                args.onerror();\n                            }\n                        }\n                        form.find(\"[data-cid=\" + data.which + \"]\").addClass(\"required-missing\");\n                        if (data.errors) {\n                            $.triggerwarning({\n                                key: \"form-field-\" + data.which,\n                                container: form\n                            }, function () {\n                                $.eosmsg(data.errors);\n                            });\n                            \/\/console.log(data);\n                            \/\/$.eosmsg(data.errors);\n                        }\n                    } else {\n\n                        switch (data.action) {\n                            case \"redirect\":\n                                document.location = data.redirect;\n                                break;\n\n                            case \"reset\":\n                                mfl.data(\"reset\")();\n                                if (data.msg) {\n                                    $.eosmsg({\n                                        \"auto-close\": true,\n                                        \"actimeout\": 3000,\n                                        content: data.msg\n                                    });\n                                } else {\n                                    $.eosmsg({\n                                        \"auto-close\": true,\n                                        \"actimeout\": 3000,\n                                        content: \"Form Submitted\"\n                                    });\n                                }\n\n                                return;\n\n                            default:\n                                if (data.js) {\n                                    var tf = new Function(data.js);\n                                    tf(form, data, ddiv);\n                                    break;\n                                }\n                                if (data.html) {\n                                    \/\/form.html(data.html);\n                                    \/\/do nothing - js events etc all break if we do this!\n                                }\n                                if (data.errors) {\n                                    alert(data.errors);\n                                    return;\n                                }\n                        }\n                        \/\/looks like all ok, so don't let the user re-submit\n                        form.data({\n                            submitted: true\n                        });\n\n                        $(\".layout-component.payment-before-complete\").trigger(\"payment-bypassed\");\n\n                        form.find(\".button.tab-ctrl.next-tab\").trigger(\"click\", {nosubmit: true, nocloseevent: true});\n                    }\n                });\n            });\n        }\n    });\n});\n\n\/*******\n\/form\/script\/public\/base\n*********\/\n\n$(document).ready(function () {\n\n    $(\".layout.mod_form:not(.initialised)\").each(function () {\n        var mf = $(this);\n\n        if (!mf.find(\"form\").length) {\n            return;\n        }\n\n        let stored_data = {};\n\n        const form = mf.find(\"form\");\n\n        if (form.attr(\"data-session-data-check\")) {\n\n            const query = {\n                \"form-id\": form.find(\"input[name='form-id']\").val()\n            };\n\n            $.post(\"\/form\/api\/data-available\", query, function (data) {\n                if (data === \"YES\") {\n\n                    $.triggerwarning({\n                        key: \"mod-form-load-session-data\",\n                        onload: function (ddiv) {\n                            \/\/alert(\"OK\");\n\n                            ddiv.find(\".button.ok\").on(\"click\", function (e) {\n                                e.preventDefault();\n                                ddiv.find(\".button.close\").trigger(\"click\");\n                                $.post(\"\/form\/api\/get-session-data\", query, function (data) {\n                                    if (data.status === \"OK\") {\n\n                                        form.data({\n                                            initialising: true\n                                        });\n\n                                        stored_data = data.post;\n\n                                        $.each(data[\"post\"], function (k, v) {\n                                            \n                                            if(v[\"component-only\"]){\n                                                const component = form.find(\".layout-component[data-cid='\" + v.cid + \"']\");\n                                                if(component.length){\n                                                    component.trigger(\"load-previous\", v);\n                                                }\n                                            }\n\n                                            const input = form.find(\":input[name='\" + k + \"']\");\n\n                                            if (input.length) {\n\n                                                let type = \"text\";\n\n                                                if (input[0].tagName.toLowerCase() === \"textarea\") {\n                                                    type = \"text-area\";\n                                                } else if (input[0].tagName.toLowerCase() === \"select\") {\n                                                    type = \"select\";\n                                                } else {\n                                                    type = input.attr(\"type\");\n                                                }\n\n                                                switch (type) {\n                                                    case \"text\":\n                                                    case \"date\":\n                                                    case \"datetime-local\":\n                                                        input.val(v);\n                                                        input.trigger(\"input\");\n                                                        break;\n\n                                                    case \"radio\":\n\n                                                        if (!v) {\n                                                            v = \"\";\n                                                        }\n\n                                                        input.each(function () {\n                                                            if ($(this).prop(\"value\") === v) {\n                                                                $(this).trigger(\"click\");\n                                                                return -1;\n                                                            }\n                                                        });\n                                                        break;\n\n                                                    case \"select\":\n\n                                                        if (!v) {\n                                                            v = \"\";\n                                                        }\n\n                                                        if (v) {\n                                                            input.find(\"option\").each(function () {\n                                                                if ($(this).attr(\"value\") === v || $(this).text() === v) {\n                                                                    input.val($(this).attr(\"value\"));\n                                                                }\n                                                            });\n                                                        }\n\n                                                        input.trigger(\"change\");\n                                                        break;\n\n                                                    case \"checkbox\":\n                                                        if (v) {\n                                                            input.trigger(\"click\");\n                                                        }\n                                                        break;\n\n                                                    case \"text-area\":\n                                                        input.val(v);\n                                                        input.trigger(\"input\");\n                                                        break;\n                                                }\n                                            }\n\n                                        });\n\n                                        form.data({\n                                            initialising: false\n                                        });\n\n                                    } else {\n                                        $.eosmsg(data);\n                                    }\n                                });\n                            });\n\n                        }\n                    }, function () {\n                        $.eosmsg(data.msg);\n                    });\n\n                    \/*\n                     return;\n                     \n                     if (confirm(\"Load Previously Entered Data?\")) {\n                     \n                     }*\/\n                }\n            });\n        }\n\n        let input_timeout = null;\n\n        form.on(\"input\", function (e, d) {\n\n            if (form.data(\"initialising\")) {\n                return;\n            }\n\n            if (input_timeout) {\n                clearTimeout(input_timeout);\n            }\n\n            input_timeout = setTimeout(function () {\n\n                const form_data = form.find(\":not(.file-data)\").serializeObject();\n\n                const query = {\n                    \"form-id\": form.find(\"input[name='form-id']\").val()\n                };\n\n                if (!query[\"form-id\"]) {\n                    return;\n                }\n\n                $.each(form_data, function (k, v) {\n\n                    if (typeof stored_data[k] === \"undefined\") {\n                        stored_data[k] = v;\n                        query[k] = v;\n                    } else {\n\n                        const str1 = JSON.stringify(stored_data[k]);\n                        const str2 = JSON.stringify(v);\n\n                        if (str1 !== str2) {\n                            query[k] = v;\n                            stored_data[k] = v;\n                        }\n                    }\n\n                });\n\n                $.post(\"\/form\/api\/log-progress\", query, function (data) {\n                    if (data !== \"OK\") {\n                        console.log(\"Error Logging Progress\", data);\n                    }\n                });\n\n            }, 1000);\n\n        });\n\n        mf.addClass(\"initialised\");\n\n        $(this).find(\".layout-component.required\").each(function () {\n\n            var component = $(this);\n\n            $(this).data({\n                \"has-errors\": function () {\n\n                    if (component.hasClass(\"dependency-not-met\")) {\n                        return false;\n                    }\n\n                    \/\/console.log(component);\n\n                    var error = false;\n\n                    var input = component.find(\":input\");\n                    var val = \"\";\n\n                    switch (input.attr(\"type\")) {\n                        case \"checkbox\":\n                            if (input.prop(\"checked\")) {\n                                val = input.val().trim();\n                            }\n                            break;\n\n                        case \"radio\":\n\n                            input.each(function () {\n                                if ($(this).prop(\"checked\")) {\n                                    val = $(this).val().trim();\n                                }\n                            });\n\n                            break;\n\n                        default:\n                            val = input.val();\n                            if (val) {\n                                val = val.trim();\n                            }\n                    }\n\n                    if (input.attr(\"data-initial-value\") && input.attr(\"data-initial-value\").length) {\n                        if (val === input.attr(\"data-initial-value\")) {\n                            val = \"\";\n                        }\n                    }\n\n                    if (input.attr(\"data-symbol\") && input.attr(\"data-symbol\").length) {\n                        if (val === input.attr(\"data-symbol\")) {\n                            val = \"\";\n                        }\n                    }\n\n                    \/\/console.log(\"Val\", val);\n\n                    if (val && val.length) {\n                        input.addClass(\"complete\");\n                        component.addClass(\"complete\");\n                        component.removeClass(\"required-missing\");\n                        component.find(\".form-field-error\").remove();\n                    }\n\n                    if (!component.hasClass(\"complete\")) {\n                        let msg = component.attr(\"data-missing-message\");\n\n                        error = true;\n\n                        component.addClass(\"required-missing\");\n\n                        if (!msg) {\n                            switch (input[0].tagName) {\n                                case \"SELECT\":\n                                    msg = \"Please select an item in the list\";\n                                    break;\n\n                                case \"TEXTAREA\":\n                                    msg = \"Please supply a value\";\n                                    break;\n\n                                case \"INPUT\":\n                                    switch (input.attr(\"type\")) {\n                                        case \"text\":\n                                            msg = \"Please supply a value\";\n                                            break;\n                                        case \"password\":\n                                            msg = \"Please supply a password\";\n                                            break;\n\n                                        case \"checkbox\":\n                                        case \"radio\":\n                                            msg = \"Please Select one of the options\";\n                                            break;\n                                        case \"file\":\n                                            msg = \"Please Upload a File\";\n                                            break;\n                                    }\n                                    break;\n                            }\n                        }\n\n                        if (!component.find(\".form-field-error\").length) {\n                            component.append(\"<div class='form-field-error'>\" + msg + \"<\/div>\");\n                        }\n\n                        \/\/console.log(msg, component);\n                    }\n\n                    \/\/console.log(\"error = \" + error);\n\n                    return error;\n\n                }\n            });\n        });\n\n        mf.find(\"form\").on(\"submit tab-closing validate\", function (e, data) {\n            \n            var lc_container = this;\n            var throw_exception = false;\n            var trigger_submit = false;\n\n            if (data) {\n                if (data.selected) {\n                    lc_container = data.selected;\n                    throw_exception = true;\n                    var sb = lc_container.find(\".layout-component.submit-button\");\n                    if (sb.length && !sb.hasClass(\"hidden\")) {\n                        trigger_submit = true;\n                    }\n                } else if (data.throw) {\n                    throw_exception = true;\n                }\n            }\n\n            var errors = false;\n            let validated = true;\n\n            $(lc_container).find(\".layout-component.required\").each(function () {\n                if ($(this).data(\"has-errors\")) {\n                    if ($(this).data(\"has-errors\")()) {\n                        errors = true;\n                    }\n                }\n            });\n\n            $(lc_container).find(\".layout-component.form-component\").each(function () {\n                if ($(this).data(\"validate\")) {\n                    if (!$(this).data(\"validate\")()) {\n                        validated = false;\n                    }\n                }\n            });\n\n            if (!validated) {\n                e.preventDefault();\n                mf.addClass(\"error-in-form\");\n            }\n\n            if (errors) {\n                e.preventDefault();\n                mf.addClass(\"error-in-form\");\n\n                var mcoffset = $(\".main-content\").offset().top;\n                \/\/for some reason this doesn't seem to work like it used to... probably site css dependent...\n                mcoffset = 0;\n\n                var el = mf.find(\".required-missing:first\");\n\n                const dialogue = el.parents(\".ui-dialog-content:first\");\n\n                if (dialogue.length) {\n                    dialogue.animate({\n                        scrollTop: el.position().top\n                    }, 200);\n                } else {\n                    $([document.documentElement, document.body]).animate({\n                        scrollTop: (el.offset().top + mcoffset) - el.height()\n                    }, 200);\n                }\n\n            } else {\n                mf.removeClass(\"error-in-form\");\n            }\n\n            if (errors && throw_exception) {\n                throw \"Missing Fields\";\n            }\n\n            if (!validated && throw_exception) {\n                throw \"Validation Failed\";\n            }\n\n            if (trigger_submit) {\n                \/\/alert(\"Want to Submit FOrm\");\n                \/\/return;\n                \/\/console.log(lc_container.parents(\"form:first\"));\n                \/\/return;\n                lc_container.parents(\"form:first\").trigger(\"submit\", {\n                    onerror: function () {\n                        \/\/send the user back to the previous tab\n                        $(\".lm-tab[data-tab-name='\" + lc_container.attr(\"data-tab-name\") + \"']\").trigger(\"click\");\n                    }});\n            }\n\n        });\n\n        \/\/console.log(\"Settting Reset Func for form: \", $(this).parent().attr(\"data-cid\"));\n\n        $(this).data({\n            reset: function () {\n\n                const ignore = [\n                    \"form-submitted\",\n                    \"cpid\",\n                    \"form-id\"\n                ];\n\n                mf.find(\"input,textarea,select\").each(function () {\n\n                    if (ignore.indexOf($(this).prop(\"name\")) !== -1) {\n                        return;\n                    }\n\n                    switch ($(this).prop(\"tagName\")) {\n                        case \"INPUT\":\n                            switch ($(this).attr(\"type\")) {\n                                case \"radio\":\n                                case \"checkbox\":\n                                    $(this).prop(\"checked\", \"\");\n                                    break;\n\n                                case \"submit\":\n                                    break;\n\n                                default:\n                                    $(this).val(\"\");\n                            }\n                            break;\n\n                        case \"SELECT\":\n                            $(this).val(\"\");\n                            break;\n\n                        case \"TEXTAREA\":\n                            $(this).val(\"\");\n                            break;\n\n                        default:\n                            $(this).val(\"\");\n                    }\n\n                });\n            }\n        });\n    });\n\n    var check_dependencies = function (first_load) {\n\n        $(\".layout.mod_form\").each(function () {\n\n            const container = $(this);\n\n            container.find(\"[data-dependency]\").each(function () {\n\n                if (!$(this).data(\"dependency-config\")) {\n                    return;\n                }\n\n                var dependency_config = $(this).data(\"dependency-config\");\n\n                var dependent = $(this);\n\n                var dependency_met = true;\n\n                var clone = \"\";\n                var clone_index = $(this).attr(\"data-clone\");\n\n                if (typeof clone_index !== \"undefined\") {\n                    clone = \"[data-clone='\" + clone_index + \"']\";\n                }\n\n                if (!clone) {\n                    clone = \":not(.cloned)\";\n                }\n\n                var dependency_method = $(this).attr(\"data-dependency-method\");\n\n                var any_matched = false;\n                var all_matched = false;\n\n                $(dependency_config).each(function () {\n\n                    if (!this.cid) {\n                        return;\n                    }\n\n                    var selector = \"[data-cid='\" + this.cid + \"']\" + clone;\n                    var supervisor_container = container.find(selector);\n\n                    var supervisor = supervisor_container.find(\"input,textarea,select\");\n\n                    var supervisor_values = [];\n                    var values = this.values;\n\n                    $(supervisor).each(function () {\n                        switch ($(this).prop(\"tagName\")) {\n                            case \"INPUT\":\n                                switch ($(this).attr(\"type\")) {\n                                    case \"radio\":\n                                        if ($(this).prop(\"checked\")) {\n                                            supervisor_values[supervisor_values.length] = $(this).attr(\"data-value\");\n                                        }\n                                        break;\n\n                                    case \"checkbox\":\n                                        if ($(this).prop(\"checked\")) {\n                                            supervisor_values[supervisor_values.length] = $(this).val();\n                                        }\n                                        break;\n\n                                    default:\n                                        supervisor_values[0] = $(this).val();\n                                }\n                                break;\n\n                            case \"SELECT\":\n                                var value = $(this).find(\"option:selected\").text();\n                                supervisor_values[0] = value;\n                                break;\n\n                            case \"TEXTAREA\":\n                                supervisor_values[0] = $(this).val();\n                                break;\n\n                            default:\n                                supervisor_values[0] = $(this).val();\n                        }\n\n                    });\n\n                    var match = false;\n\n                    if (this.method === \"or\") {\n                        $(supervisor_values).each(function () {\n                            if ($.inArray(this.valueOf(), values) !== -1) {\n                                match = true;\n                            }\n                        });\n                    } else {\n                        match = true;\n\n                        if (values.indexOf(\"Any Non-Empty Value\") !== -1) {\n                            match = false;\n                            $.each(supervisor_values, function () {\n                                if (this.length) {\n                                    match = true;\n                                }\n                            });\n                        } else {\n\n                            if (!supervisor_values.length) {\n                                match = false;\n                            } else {\n                                $(values).each(function () {\n                                    if ($.inArray(this.valueOf(), supervisor_values) === -1) {\n                                        match = false;\n                                    }\n                                });\n                            }\n                        }\n                    }\n\n                    if (!match) {\n                        dependency_met = false;\n                        all_matched = false;\n                    } else {\n                        any_matched = true;\n                    }\n\n                    if (!supervisor.hasClass(\"ds-initialised\")) {\n                        supervisor.addClass(\"ds-initialised\");\n                        supervisor.on(\"input change\", function () {\n                            check_dependencies();\n                        });\n                    }\n                });\n\n                if (dependency_method === \"any\") {\n                    if (any_matched) {\n                        dependency_met = true;\n                    }\n                }\n\n                if (!dependency_met) {\n                    dependent.addClass(\"hidden dependency-not-met\");\n                    $(\".dependency-not-met\").find(\":input\").attr(\"disabled\", \"disabled\");\n                } else {\n                    if (!first_load) {\n                        dependent.removeClass(\"hidden\");\n                        $(\".dependency-not-met\").find(\":input\").removeAttr(\"disabled\");\n                        dependent.removeClass(\"dependency-not-met\");\n                        \/\/dependent.trigger(\"\");\n                    }\n                }\n\n            });\n\n        });\n    };\n\n    var init_components = function () {\n\n        $(\".layout.mod_form\").each(function () {\n            $(this).find(\"[data-dependency]\").each(function () {\n                try {\n                    if ($(this).attr(\"data-dependency\") && $(this).attr(\"data-dependency\") !== \"[]\") {\n                        $(this).data({\n                            \"dependency-config\": $.parseJSON($(this).attr(\"data-dependency\"))\n                        });\n                        $(this).addClass(\"dependant\");\n                    }\n                } catch (e) {\n\n                }\n            });\n        });\n\n        $(\".layout-component.form-component\").not(\".initialised\").each(function () {\n\n            $(this).addClass(\"initialised\");\n\n            var component = $(this);\n\n            $(this).find(\":input\").on(\"input change\", function () {\n\n                var val = \"\";\n                var input = $(this);\n\n                switch (input.attr(\"type\")) {\n                    case \"checkbox\":\n                        if (input.prop(\"checked\")) {\n                            val = input.val().trim();\n                            if (!val) {\n                                val = \"1\";\n                            }\n                        }\n                        break;\n\n                    default:\n                        val = input.val();\n                        if (val) {\n                            val = val.trim();\n                        }\n                }\n\n                if (val) {\n                    $(this).addClass(\"complete\");\n                    $(this).parents(\".layout-component:first\").addClass(\"complete\");\n                    $(this).removeClass(\"required-missing\");\n                    $(this).parents(\".layout-component:first\").removeClass(\"required-missing\");\n                    $(this).parents(\".layout-component:first\").find(\".form-field-error\").remove();\n\n                    $(this).parents(\".layout.mod_form:first\").removeClass(\"error-in-form\");\n\n                } else {\n                    $(this).removeClass(\"complete\");\n                    $(this).parents(\".layout-component:first\").removeClass(\"complete\");\n                    $(this).removeClass(\"required-missing\");\n                }\n            });\n        });\n\n        $(\".layout.mod_form\").find(\"[data-clear-initial='true']\").not(\".dci-initialised\").on(\"focus\", function () {\n\n            if (!$(this).hasClass(\"entered\")) {\n                if (($(this).attr(\"data-initial-value\") === $(this).val())) {\n                    $(this).val(\"\");\n                }\n            }\n\n            \/*\n             if (!$(this).hasClass(\"entered\")) {\n             $(this).addClass(\"entered\");\n             }*\/\n        });\n\n        $(\".layout.mod_form\").find(\"[data-clear-initial='true']\").not(\".dci-initialised\").on(\"blur\", function () {\n\n            if (!$(this).val() && $(this).attr(\"data-initial-value\")) {\n                $(this).val($(this).attr(\"data-initial-value\"));\n            }\n        });\n\n        $(\".layout.mod_form\").find(\"[data-clear-initial='true']\").addClass(\"dci-initialised\");\n\n        $(\".layout.mod_form\").find(\".layout-component[data-info-available='true']\").each(function () {\n            if (!$(this).find(\".lc-info\").length) {\n                var lc = $(this);\n\n                if (lc.attr(\"data-info-link\")) {\n                    var label = $(this).find(\"label:first\");\n                    label.wrapInner(\"<a href=''\/>\");\n                    label.find(\"a:first\").on(\"click\", function (e) {\n                        e.preventDefault();\n                        $.eosmsg({\n                            status: \"ok\",\n                            title: \"\",\n                            content: lc.attr(\"data-info\"),\n                            classes: {\"ui-dialog\": \"lc-info-large-popup\"}\n                        });\n                    });\n                } else {\n                    $(this).find(\"label:first\").append(\"<span class='lc-info'>?<\/span>\");\n                    $(this).find(\".lc-info:first\").on(\"click\", function () {\n                        $.eosmsg({\n                            status: \"ok\",\n                            title: \"Info\",\n                            content: lc.attr(\"data-info\"),\n                            classes: {\"ui-dialog\": \"lc-info-popup\"}\n                        });\n                    });\n                }\n            }\n        });\n    };\n\n    init_components();\n\n    $(document).on(\"elements-duplicated\", function () {\n        init_components();\n        check_dependencies();\n    });\n\n    check_dependencies(true);\n});"}