1angular.module('nefiksApp') 2 .factory('LinkManager', function ($location) { 3 var LinkManager = function() { 4 var _checkParamValue = function(paramName, paramValue, allowedValues) { 5 if(!allowedValues || (!!allowedValues[paramName] && allowedValues[paramName].length) == 0 || !paramValue) return paramValue; //No limitations 6 7 for(var i=0; i<allowedValues[paramName].length; i++) { 8 if(allowedValues[paramName][i] == paramValue) { //Value found 9 return paramValue; 10 } 11 } 12 return allowedValues[paramName][0]; //Return default one 13 }; 14 15 /** 16 * Parses current hash into object. 17 * @param nonNamedParam If not empty and first parameter is not in key=value form, then this is the name of first parameter. 18 * @param allowedValues allowed values for keys (if key is not present then there are no limitations). 19 */ 20 this.parseHash = function(nonNamedParam, allowedValues) { 21 var hash = $location.hash(); 22 var params = {}; 23 if(!!hash) { 24 var spl = hash.split('&'); 25 for(var i=0; i<spl.length; i++) { 26 if(spl[i].trim().length == 0) { 27 continue; 28 } 29 30 var kv = spl[i].split('='); 31 if(i==0 && kv.length==1 && !!nonNamedParam) { //This is non named parameter 32 params[nonNamedParam] = _checkParamValue(nonNamedParam, kv[0], allowedValues); 33 } else if(kv.length == 2) { 34 params[kv[0]] = _checkParamValue(kv[0], kv[1], allowedValues); 35 } 36 } 37 } 38 return params; 39 }; 40 41 /** 42 * Sets hash from given params. 43 * @param nonNamedParam If not empty, this param is the first one after hash nad name is not used. 44 * @param keepCurrent If true current hash is kept, it is extended with new params 45 */ 46 this.setHash = function(nonNamedParam, params, keepCurrent) { 47 var hash = ''; 48 if(!params) { 49 if(!keepCurrent) { 50 $location.hash(''); 51 } 52 return; 53 } 54 55 var hparam = params; 56 if(!!keepCurrent) { 57 var chp = this.parseHash(nonNamedParam, null); 58 for(var key in chp) { 59 if(!hparam[key]) { 60 hparam[key] = chp[key]; 61 } 62 } 63 } 64 65 if(!!nonNamedParam && !!hparam[nonNamedParam]) { 66 hash += hparam[nonNamedParam]; 67 } 68 for(var key in hparam) { 69 if(key == nonNamedParam || !hparam[key]) { 70 continue; 71 } 72 if(hash.length > 0) hash += '&'; 73 74 hash += key + '=' + hparam[key]; 75 } 76 $location.hash(hash); 77 }; 78 79 /** 80 * Sets single value in hash. All other values are kept 81 */ 82 this.setSingleHashValue = function(paramName, paramValue) { 83 var hash = $location.hash(); 84 var newHash = ''; 85 var paramFound = false; 86 if(!!hash) { 87 var spl = hash.split('&'); 88 for(var i=0; i<spl.length; i++) { 89 if(spl[i].trim().length == 0) { 90 continue; 91 } 92 93 var kv = spl[i].split('='); 94 if(i==0 && kv.length==1) { //This is non named parameter 95 newHash += kv[0]; 96 } else if(kv.length == 2) { 97 if(newHash.length > 0) { 98 newHash += '&'; 99 } 100 if(paramName == kv[0]) { 101 if(!!paramValue) { 102 newHash += paramName + '=' + paramValue; 103 } 104 paramFound = true; 105 } else { 106 newHash += kv[0] + '=' + kv[1]; 107 } 108 } 109 } 110 } 111 112 if(!paramFound && !!paramValue) { 113 if(newHash.length > 0) { 114 newHash += '&'; 115 } 116 newHash += paramName + '=' + paramValue; 117 } 118 if(newHash.endsWith('&')) { 119 newHash = newHash.substring(0, newHash.length-1); 120 } 121 $location.hash(newHash); 122 }; 123 124 this.setPathAndHashFromFullLink = function(fullLink) { 125 if(!fullLink) return; 126 127 var hind = fullLink.indexOf('#'); 128 $location.path(hind>=0?fullLink.substring(0, hind):fullLink); 129 $location.hash(hind>=0?fullLink.substring(hind+1):''); 130 } 131 132 /** 133 * Returns CommonQueryParams containing common api params (page and sort params) extracted from current hash.<br/> 134 * If any param is not contained in hash, it is filled with given default values.<br/> 135 * If no default values are given, base default values for page(=1) and s
135ort direction (desc) are used. 136 */ 137 this.getCommonApiParamsFromHash = function(defSort, otherParams) { 138 var hp = this.parseHash(); 139 140 var defSortBy, defSortAsc; 141 if(!!defSort) { 142 defSortBy = !!defSort?defSort.by:null; 143 defSortAsc = !!defSort?defSort.asc:null; 144 } 145 146 var cp = { 147 page: hp.page, 148 sort: { 149 by: hp.sort || defSortBy, 150 asc: hp.asc || defSortAsc 151 } 152 }; 153 154 var cqp = new CommonQueryParams(cp); 155 156 if(!!otherParams) { 157 for(var i=0; i<otherParams.length; i++) { 158 if(!!hp[otherParams[i]]) { 159 cqp.other[otherParams[i]] = hp[otherParams[i]]; 160 } 161 } 162 } 163 164 return cqp; 165 }; 166 167 /** 168 * Sets hash params from given api params (page and sort). 169 * @param whatToSet Which values should be set (if null, all values are set): page and sort. 170 */ 171 this.setHashFromCommonApiParams = function(params, whatToSet) { 172 var setPage = !!params.page && (whatToSet==null || !!whatToSet.page); 173 var setSort = !!params.sort && (whatToSet==null || !!whatToSet.sort); 174 175 if(setPage) { 176 this.setSingleHashValue('page', params.page); 177 } 178 if(setSort) { 179 this.setSingleHashValue('sby', params.sort.by); 180 this.setSingleHashValue('sasc', !!params.sort.asc); 181 } 182 if(!!params.other) { 183 for(var key in params.other) { 184 this.setSingleHashValue(key, params.other[key]); 185 } 186 } 187 }; 188 }; 189 190 return new LinkManager(); 191 });
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.