Understanding this Javascript function -


i continuing project. , thing not understand. key function assembling filter string used sql query. function invoke via onclick of button.

my problem value query taken $_request['filter'].

<input id="hdn_filter" name="filter" type="hidden" value="<?php echo $_request['filter']; ?>"> 

at first $_request['filter'] empty. upon pressing submit button assembles , return string. don't understand how assembled string. because seems function value input. it's value empty. function should received empty input. it's going in circles

example "" != means in javascipt anyway?

an example of assembled string ""deliver_store_account=all^stores_account=all^active=1^part_number=all^new_part_number=all""

and see join("^") part in function. , seems line assembles it. why inside switch parenthesis?

 function submit(e, t) {     array_filter = new array;      (i in array_dropdown) {         if (varfield = array_dropdown[i], varid = "sel_" + varfield, arytemp = new array, -1 != document.getelementbyid(varid).selectedindex)             (i = 0; < document.getelementbyid(varid).options.length; i++)                 document.getelementbyid(varid).options[i].selected === !0 && (arytemp[arytemp.length] = document.getelementbyid(varid).options[i].value);         arytemp.length > 0 && (array_filter[varfield] = arytemp)     }      "" != document.getelementbyid("hdn_search").value && (arytemp.search = document.getelementbyid("hdn_search").value), array_filter_temp = new array;     (i in array_filter)         array_filter_temp[array_filter_temp.length] = + "=" + array_filter[i].join("|");     switch (varfilter = array_filter_temp.join("^"), document.getelementbyid("hdn_filter").value = varfilter, document.getelementbyid("hdn_excel").value = 1 == e ? 1 : 0, !0) {         case 1 == t:             document.getelementbyid("hdn_override").value = 1;             break;         case 0 == t:             document.getelementbyid("hdn_override").value = 0;             break;         case-1 == t:     }      vartxtbox = document.getelementbyid("txt_search").value;     alert(vartxtbox);      document.getelementbyid("form1").submit() } 

whoever wrote code trying obfuscate it, making hard else understand does, perhaps because result sent sql query, stated. of course, if want hide users, specially sql commands, implement server-side.

1) "" != part:

"" != document.getelementbyid("hdn_search").value                // left side &&                                                               // logical , (arytemp.search = document.getelementbyid("hdn_search").value),  // right side array_filter_temp = new array;                                   // statement 

here he's taking advantage of short-circuit evaluation, if left side of expression evaluates false, right side isn't executed. next statement after , executed (read more comma operator). it's same writing:

if (document.getelementbyid("hdn_search").value != "") {     arytemp.search = document.getelementbyid("hdn_search").value } array_filter_temp = new array; 

2) switch part:

switch (     varfilter = array_filter_temp.join("^"),      document.getelementbyid("hdn_filter").value = varfilter,      document.getelementbyid("hdn_excel").value = 1 == e ? 1 : 0,      !0 ) { 

the first 2 trivial. on third one, assigning hdn_excel based on value of e. adding parenthesis makes clearer: document.getelementbyid("hdn_excel").value = (1 == e) ? 1 : 0

the !0 there make sure rest of switch executed (it evaluates true). if 0 or false, hdn_override never assigned value.

so whole set rewritten as:

varfilter = array_filter_temp.join("^"); document.getelementbyid("hdn_filter").value = varfilter; document.getelementbyid("hdn_excel").value = (e == 1) ? 1 : 0; switch (t) {     case 1:         document.getelementbyid("hdn_override").value = 1;         break;     case 0:         document.getelementbyid("hdn_override").value = 0;         break; } 

3) first for loop: (you haven't asked, here goes anyway)

for (i in array_dropdown) {     if (         varfield = array_dropdown[i],          varid = "sel_" + varfield,          arytemp = new array,          -1 != document.getelementbyid(varid).selectedindex     )         (i = 0; < document.getelementbyid(varid).options.length; i++)             document.getelementbyid(varid).options[i].selected === !0 && (arytemp[arytemp.length] = document.getelementbyid(varid).options[i].value);     arytemp.length > 0 && (array_filter[varfield] = arytemp) } 

again use of , operator execute commands , return value of last 1 if, -1 != document.getelementbyid(varid).selectedindex, second for loop run if element in varid has selectedindex.

the === !0 same === true.

this rewritten as:

for (key in array_dropdown) {     varfield = array_dropdown[key];     varid = "sel_" + varfield;     arytemp = new array;     if (document.getelementbyid(varid).selectedindex != -1) {         (i = 0; < document.getelementbyid(varid).options.length; i++) {             if (document.getelementbyid(varid).options[i].selected) {                 arytemp[arytemp.length] = document.getelementbyid(varid).options[i].value;             }         }     }     if (arytemp.length > 0) {         array_filter[varfield] = arytemp;     } } 

as side note, if can, suggest refactor code, send collected data server , transformation needed on server-side.


Comments