March 2009 - Posts
האם יש משמעות להרים events בתוך static cror ?
התשובה היא, לא!
מכיון שאין שוב מצב שמישהו יקבל את ההודעה שהאירוע התרחש,
בגלל ההנחות הבאות:
1. מתוך static ctor, אפשר לגשת אך ורק ל static events.
2. ה static ctor, יתרחש תמיד שנייה לפני השימוש הראשון ב static של ה class
3. ניסיון של רישום ל static events, יגרום להפעלת ה static ctor.
4. הרישום לאירוע, לא יקלט לפני סיום ה ctor.
ולכן אף פעם לא נוכל להרים אירוע מתוך ה static ctor.
הפיתרון היחיד שמצאתי היה, שמיד אחרי הרישום לאירוע הפעלתי בעצמי את המתודה, לדוגמא:
StaticClass.StaticEvent += StaticClass_StaticEvent;
StaticClass_StaticEvent(null, null);
אם למישהו יש רעיון יותר טוב, אשמח לשמוע על זה.
אתם זוכרים תמיד לתת כותרת לדפים שלכם, לפני שאתם מעילם את האתר לשרת ?
תלחצו על הלינק הבא (חיפוש בגוגל את המילים Untitled Page)
תופתעו לגלות כמה תוצאות יש.
אז כתבנו Resource file, והכנסנו לתוכו את כל ההודעות שלנו,
ואפילו הגדרנו אותו כ public, כדי שנוכל לגשת אליו מכל הפרויקטים,
אבל מה אנחנו עושים, עם ההודעות שאנחנו רוצים להציג ב JavaScript,
אז הנה הפיתרון:
בפרויקט שאפשר להוריד
מכאן:
יש פרויקט שנקרא Common, שבו יש את ה resource file,
הוספנו בפרויקט ה web, קובץ מסוג HttpHandler,
שקורא את כל המאפיינים של ה Resource, ומחזיר מערך JS, עם כל הערכים.
הנה הקוד:
1 public void ProcessRequest(HttpContext context)
2 {
3 context.Response.ContentType = "application/js";
4
5 // Get the type of the resource class
6 Type messagesType = typeof(Messages);
7
8 // Get the all properties taht is public and static
9 PropertyInfo[] properties = messagesType.GetProperties(
10 BindingFlags.Public | BindingFlags.Static);
11
12 // Get a collection of Pair,
13 // the first is the property name, and the secound is the property value
14 var stringProperties =
15 from property in properties
16 where property.PropertyType == typeof(string)
17 select new Pair(property.Name, property.GetValue(null, null));
18
19
20 // Build the javascript array
21 StringBuilder bulder = new StringBuilder();
22 bulder.Append("var messageArray = new Array(); ");
23
24 foreach (var item in stringProperties)
25 {
26 bulder.Append(string.Format("messageArray['{0}'] = '{1}'; ",
27 item.First, item.Second));
28 }
29
30 context.Response.Write(bulder.ToString());
31 }
אז מה כתוב בקוד:
שורה 3: הגדירה שמה שחוזר הוא מסוג JavaScript
שורה 6: קבלת ה Type של Messages (קובץ ה Resource)
שורה 9: קבלת כל המאפיינים שמוגדרים כ: public static
שורה 14 - 17: קבלת Collection של Pair, שמכיל את השם של המאפיין, ואת ערכו. (null, null בשורה 17, זה בגלל שהמאפיין הוא סטטי, ולא indexer)
שורה 21: הגדרת ה StringBuilder, שיכיל את המערך ה JS.
שורה 22: הגדרת המערך ב JS.
שורה 24 - 28: ריצה על כל המאפיינים שקבלנו, ולהוסיף אותם למערך.
שורה 30: כתיבה של המערך ל Response.
השימוש בצד ה Web, יהיה פשוט:
1 <script src="MessageHandler.ashx" type="text/javascript"></script>
2 <script type="text/javascript">
3 function Show() {
4 alert(messageArray['Name']);
5 alert(messageArray['Address']);
6 }
7 </script>
ייבוא של ה JS, מתוך ה httpHandler.
ואז פשוט להשתמש במערך.
תהנו
כתבתי טבלת html פשוטה שיש בה שני שורות ובכל שורה עמודה אחת עם תמונה.
כאן:
התמונות הם למעשה תמונה אחת גדולה שנחתכה לשניים, לצורך עבודת html קלה.
הבעייה שלי הייתה, שהייתי אמור להצמיד את התמונות, כך שלא יהיה רווח ביניהם.
בהתחלה כתבתי את הקוד הבא:
1 <table>
2 <tr>
3 <td>
4 <img src="http://blogs.microsoft.co.il/photos/shlomo/images/248506/original.aspx" />
5 </td>
6 </tr>
7 <tr>
8 <td>
9 <img src="http://blogs.microsoft.co.il/photos/shlomo/images/248506/original.aspx" />
10 </td>
11 </tr>
12 </table>
זה הביא לי את התוצאה הבאה:
ואז כמובן שניסיתי להוסיף cellpading=0 cellspacing=0,
1 <table cellpadding="0" cellspacing="0">
2 <tr>
3 <td>
4 <img src="http://blogs.microsoft.co.il/photos/shlomo/images/248506/original.aspx" />
5 </td>
6 </tr>
7 <tr>
8 <td>
9 <img src="http://blogs.microsoft.co.il/photos/shlomo/images/248506/original.aspx" />
10 </td>
11 </tr>
12 </table>
זה לא עזר, זה אמנם קירב קצת, אבל התוצאה הייתה נראת כך:
האופצייה הבאה שלי, הייתה להשתמש ב background של התמונה לעמודה, במקום אובייקט תמונה,
ואז יחד עם ה cellpading ו cellspacing, זה עבד.
1 <table cellpadding="0" cellspacing="0">
2 <tr>
3 <td style="background-image:
4 url(http://blogs.microsoft.co.il/photos/shlomo/images/248506/original.aspx);
5 width:128px; height:58px;">
6
7 </td>
8 </tr>
9 <tr>
10 <td style="background-image:
11 url(http://blogs.microsoft.co.il/photos/shlomo/images/248506/original.aspx);
12 width:128px; height:58px;">
13
14 </td>
15 </tr>
16 </table>
וכמובן שזה עבד רק בתוספת של cellpadding="0" cellspacing="0"
הבעייה שלי הייתה שעל התמונה שלי (
באתר של סלע) מופיע כיתוב של "לסיור וירטואלי", שאמור להיות לינק.
והאופצייה היחידה שעמדה לרשותי, היה, להשתמש ב image map,
הבעייה כמובן, שברגע שהתמונה היא, background, אי אפשר לצרף לה imgae map,
ומצד שני, לא הצלחתי למצוא איך לגרום לתמונות להיות רצופות.
ניסתי לעשות ל td העליון valign=butoom, ולתחתון valign=top,
לא עזר, בין השורות היה רווח.
בסופו של דבר אמר לי מישהו עם הרבה נסיון ב html, שאני אנסה לתת valign לתמונה בעצמה:
1 <table cellpadding="0" cellspacing="0">
2 <tr>
3 <td>
4 <img src="http://blogs.microsoft.co.il/photos/shlomo/images/248506/original.aspx"
5 style="vertical-align:bottom" />
6 </td>
7 </tr>
8 <tr>
9 <td>
10 <img src="http://blogs.microsoft.co.il/photos/shlomo/images/248506/original.aspx" />
11 </td>
12 </tr>
13 </table>
וכבמעשה ניסים, זה עבד.
כבר כתבתי בעבר על IE8,
שאני אוהב אותו, ומחכה שהוא ייצא בגרסה רשמית,
אמנם
כתבתי, שאני לא מתכוון לעבור אליו, בגלל שאני לא יכול להחזיק גרסאות אחרות במקביל, יש אמנם את
הפתרון של
רותם,
אבל , זה לא כולל את IE7,
בכל מקרה, רציתי להציג את אחד מהדברים היותר נחמדים שקיים ב IE8, (ממש התלהבתי מזה).
אנחנו מדברים על: Dynamic Web Slices.
אני רוצה להציג בקצרה מה אפשר לעשות, ואיך, בפוסט שם יש מעבר על כל המאפיינים של ה Dynamic Web Slices.
לפני שנראה קוד, בואו נראה תוצאה:
אנחנו רואים, WebSlice, שמציג את השער היציג של המטבעות , ישר מבנק ישראל.
נחמד, לא ?,
כל פעם שאני רוצה לראות את השער היציג של מטבע מסוים, אני לוחץ על הלחצן, ורואה, מבלי צורך לגלוש לאתר של בנק ישראל.
אז איך עושים את זה ?
דבר ראשון כמובן שאתם צריכים לייצר את הדף שאתם רוצים, שהוא יהיה התוכן של ה WebSlice,
בדוגמא שלנו, יצרתי דף שמתחבר לבנק ישראל, מוריד קובץ xml, שמכיל את שערי המטבע, ומציג את התוצאות בגריד.
כעת אחר שיצרנו את הדף,
נכתוב את הקוד שגורם לו להיות מוצג כ WebSlice.
הנה:
1 <div class="hslice" id="slCurrency">
2 <span class="entry-title">Currencies</span>
3 <a rel="entry-content" href="http://localhost:1731/Default.aspx"
4 style="display: none;"></a>
5 <span class="entry-content">Add the Currencies Slice</span>
6 <span class="ttl" style="display: none;">15</span>
7 <a rel="bookmark" href="http://localhost:1731/Default.aspx"
8 style="display: none;"></a>
9 </div>
ה class=hslice, גורם ל IE, להבין שה div הוא WebSlice,
וכשתעמדו עם העכבר על ה div, הוא יציע לגולש להוסיף את התוכן כ WebSlice.
צריך לתת Id, ל div.
ה span, שמכיל את הclass של entry-titke, יהיה הכותרת של ה WebSlice.
ה ttl, מגדיר כל כמה שמן זה יתרפרש (ניתן לשינוי על ידי המשתמש)
וה a של entry-content, יחיל את הלינק להיכן נמצא התוכן שאמור להיות מוצג.
ה span הבא אחריו, הוא תוכן כלשהו, (לא ב WebSlice - אלא בדף שבו נמצא הלינק להוספת ה Slice)
הלינק שמוגדר כ bookmark, הוא מה שמוצג בשורה התחתונה ב WebSlice,
תוכלו לקבוע שם url שונה מה url של ה slice, שהגולש יוכל ללחוץ עליו.
שימו לב שגודל ברירת מחדל של ה Slice, הוא: 320 על 240.
אני לא אאריך מעבר לכך, אבל אני ממליץ לכם לעבור על ה
פוסט שמסביר בפירוט על הנושא.
דרך אגב, הייתי חייב להתקין את IE8, עבור הפוסט הזה, וגילית באג נחמד בו.
ככה מדי פעם, כשאני כותב את הפוסט, כל התוכן מחליט להעלם, ורק אם אני משחק עם הגודל של תיבת הטקסט, (ע"י החץ מצד ימין של העורך)
אני רואה החזרה את התוכן.
מיום ליום אני מתעצבן פחות על ה java script, ואני מגלה עוד דברים נהדרים שאפשר לעשות איתו.
כאן אני רוצה להראות, עד כמה זה פשוט מ JavaScript לפנות ל Web Service, לקבל מידע ב JSON, ולעבוד איתו.
שלב ראשון, נכתוב WebService.
1 public class Student
2 {
3 public string Name { get; set; }
4 public string Address { get; set; }
5 public string Phone { get; set; }
6 public int Age { get; set; }
7 }
8 [WebService(Namespace = "http://tempuri.org/")]
9 [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
10 [ToolboxItem(false)]
11 [ScriptService]
12 public class JsonWebService : WebService
13 {
14
15 [WebMethod]
16 public Student[] GetAllStudent()
17 {
18 return new Student[]
19 {
20 new Student(){ Name = "Shlomo",
21 Age = 24,
22 Phone = "123456",
23 Address = "Elad"},
24
25 new Student(){ Name = "Yossi",
26 Age = 23,
27 Phone = "543256",
28 Address = "Beni brak"},
29
30 new Student(){ Name = "Tomer",
31 Age = 30,
32 Phone = "0000000",
33 Address = "Tel Aviv"}
34 };
35 }
36 }
37 }
הגדרנו class כלשהו, ואנחנו מחזירים מערך שלו במתודה של web service.
כעת נכתוב מתודה ב JavaScript, שיודעת לפנות לשרת ולהחזיר JSON, (במחרוזת)
את הקוד הבא העתקתי (עם קצת שינויים)
מכאן:
38 function GetSynchronousJSONResponse(url, postData) {
39 var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
40
41 //false means synchronous
42 xmlhttp.open("POST", url, false);
43 xmlhttp.setRequestHeader("Content-Type",
44 "application/json; charset=utf-8");
45
46 xmlhttp.send(postData);
47 var responseText = xmlhttp.responseText;
48 return responseText;
49 }
המתודה מקבלת url של web Service + web method, ו postData שזה פרמטרים עבור המתודה.
מייצרים אובייקט של xmlhttp,
מגדירים את כל ההגדרות, ומצפים לתשובה.
כעת נראה את הקריאה למתודה.
50 function GetData() {
51 var url = 'http://localhost/jsondemp/JsonWebService.asmx/GetAllStudent';
52 var result = GetSynchronousJSONResponse(url, null);
53
54 }
במידה ונעשה alert למה שחוזר, נראה את הדבר הבא:
כעת מה שנשאר, זה להפוך את המחרוזת הזאת לאובייקט JSON, שאפשר לעבוד איתו.
נכתוב את הקוד הבא:
55 function GetData() {
56 var url = 'http://localhost/jsondemp/JsonWebService.asmx/GetAllStudent';
57 var result = GetSynchronousJSONResponse(url, null);
58 //alert(result);
59 result = eval('(' + result + ')');
60
61 for (var i = 0; i < result.d.length; i++) {
62 var person = result.d[i];
63
64 var name = person.Name;
65 var phone = person.Phone;
66
67
68 }
69 }
כמו שאתם רואים ה eval מקמפל את המחרוזת לאובייקט שמכיל persons,
וכעת אנחנו יכולים לעבוד עם זה בקלות.
הבעייה ידועה, אם פתחתם יותר מפוסט אחד במקביל, תוכלו להגיב רק לאחרון, או שתרפרשו את הדף.
כתבתי בעבר פוסט שמסביר למה זה קורה,
כאן.
למה נזכרתי עכשיו ?
כי שמעתי
מאבי, שהוא רצה להגיב לי, אבל ה CAPTCHA שוב תקע אותו,
ואז אמרתי לעצמי, שאם אני לא מקבל תגובות בגלל זה, אני חייב לפטור את הבעייה.
אז כתבתי AddIn ל IE, שיעיף את הבדיקה המעצבנת.
כבר כתבי בעבר AddIn עבור כותבי הפוסטים בעברית, כדי לעבור מימין לשמאל ומשמאל לימין,
כאן:
כל ההסברים איפה מותקן ה AddIn, מוסבר שם.
כאן אני רק אציג מה אנחנו מקבלים.
אז את ההתקנה תוכלו להוריד
מכאן. (כולל קוד המקור)
אחרי החילוץ קובץ ההתקנה נמצא: DeleteCAPTCHAInstaller\Debug
אחרי ההתקנה כשתלחצו קליק ימני על העכבר ב IE, תקבלו את הדבר הבא:
כשתלחצו על Delete CAPTCHA, זה יעיף את הבדיקה, ותוכלו להגיב בלי להכניס את המספרים.
רק כדי שאף אחד לא יחשוב שאני מכניס לו וירוסים, אז הנה הסקריפט שרץ:
1 <SCRIPT LANGUAGE = "JavaScript">
2
3 // Get the window object where the context menu was opened.
4 var oWindow = window.external.menuArguments;
5
6
7 if(oWindow.location.host == "blogs.microsoft.co.il")
8 {
9 var oDocument = oWindow.document;
10 for(var i = 0; i < oDocument.all.length; i++)
11 {
12 if(oDocument.all[i].clientvalidationfunction != null)
13 {
14 if(oDocument.all[i].clientvalidationfunction == 'ValidateCaptcha')
15 {
16 oDocument.all[i].clientvalidationfunction = '';
17 break;
18 }
19 }
20 }
21 }
22 </SCRIPT>
אני מקבל את החלון של ה menu.
בודק האם אני נמצא באתר הבלוגים.
רץ על כל האלמנטים בעמוד,
בודק עבור כל אלמנט, האם יש לו attrubute שנקרא clientvalidationfunction,
במידה וכן, האם הערך שלו זה 'ValidateCaptcha'
במידה וכן, נמחק את זה, ונצא מהלולאה.
מקווה שעשיתי לכם חיים קלים.
נתקלתי היום בבעייה מעצבנת ב java script.
האמת זה לא פייר להגיד שהבעייה הזאת מעצבנת, כי כל הבעיות ב java script מעצבנות. (אבל זאת במיוחד).
הפוסט הזה ודוגמאות הקוד נכתבו בעזרתו של אחי, יוסי גולדברג.
הייתי צריך להוסיף ב RunTime שורות לטבלה. ולהוסיף onclick על ה td,
נשמע פשוט, לא ?
נראה בהתחלה את הקוד של הוספת השורות. (יש כמה דרכים, אני בחרתי באחת מהם)
1 function createAtRunTime() {
2 var table = document.getElementById('tbl').
3 getElementsByTagName("TBODY")[0];
4
5 for (var i = 0; i < 5; i++) {
6 var row = document.createElement("TR")
7 var cell = document.createElement("TD")
8
9 cell.appendChild(document.createTextNode('shlomo goldberg'));
10
11 row.appendChild(cell);
12 table.appendChild(row);
13 }
14 }
אני מוצא את הטבלה שלי.
רץ בלולאה חמש פעמים.
יוצר שורה.
יוצר עמודה.
מוסיף טקסט לעמודה.
מוסיף את העמודה לשורה.
ומוסיף את השורה לטבלה.
עד כאן הכל פשוט וברור.
עכשיו אני רוצה להוסיף שבזמן לחיצה על העמודה יקרה משהו.
שלב ראשון, אנחנו נפעיל פונקצייה שמציגה הודעה.
אז, נוכל להשתמש ב attachEvent (עבור IE), בצורה הבאה:
1 cell.attachEvent("onclick", ShowMsg);
2 function ShowMsg() {
3 alert("Msg");
4 }
או להשתמש עם setAttribute (תואם לכל הדפדפנים), בצורה הבאה:
5 cell.setAttribute("onclick", function() { ShowMsg() });
וכאן יש לי בעייה, נניח שאני רוצה להפעיל מתודה שמקבלת פרמטרים.
אין לי דרך לעשות את זה.
כי ב attachEvent, הוא מוכן לקבל רק שם של מתודה (כמו delegate)
וב setAttribute, במידה ואני שולח פרמטרים, רק האחרון יתפוס,
לדוגמא, אם הקוד שלי נראה כך:
1 cell.setAttribute("onclick", function() { ShowMsg(i) });
2 function ShowMsg(msg) {
3 alert(msg);
4 }
כל חמש העמודות כשילחצו עליהם יציגו את המספר 5.
והסיבה היא פשוטה.
שורה מספר אחד, מייצרת מתודה אנונימית, בכל פעם שאני משנה את הערך של i בתוך הקריאה אני למעשה משנה את אותו עותק של המתודה האנונימית,
כשלבסוף נשאר לי מתודה שמתיגה את המספר 5.
למעשה אפשר לתרגם את שורה מס' 1, ל
1 var newFunc = function myFunc() { ShowMsg(i); };
2 cell.setAttribute("onclick", newFunc);
למעשה בכל פעם אנחנו משנים את התוכן של הפונקצייה שנקראת myFunc
מה שלכאורה היינו צריכים לעשות זה לייצר רנדומלית שם של פונקצייה, מה שכנראה לא אפשרי.
ולכן הפיתרון שמצאתי הוא כזה.
1 cell.setAttribute("msg", i);
2 cell.setAttribute("onclick", ShowMsg);
3 function ShowMsg() {
4 alert(event.srcElement.msg);
5 }
הרי אני יכול להוסיף כל attribute שעולה על דעתי ולתת איזה ערך שאני רוצה.
אז אני מוסיף attribute שנקרא msg, ונותן לו את ההודעה שאני רוצה להציג למשתמש בזמן לחיצה, (בדוגמא את הערך של i)
והפונקצייה תיקח ממי שקרא לה את הערך מתוך ה attribute.
הנה הקוד המלא:
1 function createAtRunTime() {
2 var table = document.getElementById('tbl').
3 getElementsByTagName("TBODY")[0];
4
5 for (var i = 0; i < 5; i++) {
6 var row = document.createElement("TR")
7 var cell = document.createElement("TD")
8
9 cell.setAttribute("msg", i);
10 cell.setAttribute("onclick", ShowMsg);
11 cell.appendChild(document.createTextNode('shlomo goldberg'));
12
13 row.appendChild(cell);
14 table.appendChild(row);
15 }
16 }
17
18 function ShowMsg() {
19 alert(event.srcElement.msg);
20 }
רציתי להפעיל את IE Developer Tollbar כשה explorer היה במצב של מסך מלא.
מה שמתברר, שאמנם זה מסך מלא.
אבל לחיצה על alt פותחת את התפריטים, ואפשר לטייל בין בתפריטים, בלי לראות את ה menu bar
מה שכן, במידה והפעלתם את אינטרנט אקפלורר, מראש במסך מלא.
בצורה הבאה:
iexplore.exe -k
אני לא ממש מבין את התועלת של ה k- הזה.
אבל במקרה הזה אי אפשר לפתוח את שורת התפריטים.
כבר כתבתי
בעבר על התיסכול שלי, ממערכות תוכן לא טובות (בלשון המעטה) שהופוכות אותי למתכנת html ו javaScript, (ללא כוונות פגיעה למתכנתי html)
בכל מקרה, אחד מהמשימות שלי היה, לשנות את המראה של מה שאנחנו מקבלים ממערכת התוכן,
לדוגמא:
שינוי צבע הרקע של העמוד.
או, בראש העמוד יש תמיד שני חלקים, אחד עבור תמונה, והשני עבור טקסט חופשי, והייתי אמור לאפשר להכניס תמונה שתתפרש על כל השטח. (גם על השטח של האיזור החופשי.)
אז איך פתרתי את הבעייה,
הפיתרון הוא פשוט. אחרי שהדף עולה, אני יכול להפעיל סקריפט שישנה את ההופעה של אלמנטים.
אחרי שהדף עולה, אני מפעיל את ה IE Developer Toolbar, על ידי
View->Explorer Bar->IE Developer Tool Bar
או על ידי לחיצה על החץ הקטן, ובחירה ב IE Developer Toolbar
ואז בתחתית המסך נקבל את ה Developer ToolBar.
יש לו הרבה שימושים,
אבל מה שאהבתי, זה שיש לו את היכולת לשנות ערכים של ה html ב RunTime.
לדוגמא עם אני רוצה לשנות את ה Title של הפוסט שכתוב שם "שלמה גולדברג" ולהעלים אותו.
כך זה נראה לפני:
ואז אני אשתמש ב ToolBar כדי למצוא את האלמנט שזה div, ולהוסיף לו Display=none.
וזה יעלים אותו ב RunTime
אני בחרתי את ה div שמכיל את השם,
ואני מוסיף לו איזה סגנון שאני רוצה.
אחרי שהבנתי מה אני צריך לשנות.
בדוגמא, (אצלנו להעלים עמודה אחת של הטבלה, ולתת colspan=2 לעמודה שמכילה את התמונה, כדי שאני אוכל להכניס תמונה שתתפרש גם על האיזור החופשי)
אני רק צריך לכתוב את הסקריפט.
אבל אני יכול להגיד בוודאות שלולא ה IE Developer Tool Bar, החיים שלי היו הרבה יותר קשים.
כשראיתי את
הפוסט של
שחר. נזכרתי שאח שלי
יוסי כתב שני מתודות נחמדות ב JavaScript, שעוזרות לי לפרסר QueryString.
המתודה הראשונה, היא FIndByName, שמקבלת key וQueryString
ה QueryString, הינו פרמטר רשות, במידה והפונקצייה לא תקבל אותו, היא תקח את ה QueryString של העמוד הנוכחי.
המתודה השניה היא FindByIndex, שמקבלת מיקום ומחזירה את ה value.
1 function FindByName(key, search)
2 {
3 if(search == undefined)
4 {
5 search = new String(window.location.search);
6 }
7
8 var indexOf = search.indexOf(key, 0);
9 if(indexOf == -1)
10 {
11 return "";
12 }
13
14 var ampIntex = search.indexOf("&", indexOf);
15
16 var value;
17 if(ampIntex > -1)
18 {
19 value = search.substring(indexOf + key.length + 1,
20 search.indexOf("&", indexOf));
21 }
22 else
23 {
24 value = search.substring(indexOf + key.length + 1);
25 }
26
27 return unescape(value);
28 }
29
30
31 function FindByIndex(index, search)
32 {
33 if(search == undefined)
34 {
35 search = new String(window.location.search);
36 }
37
38 var ctrIndex = 0;
39 while(index > -1 && ctrIndex > -1)
40 {
41 ctrIndex = search.indexOf("=", ctrIndex + 1);
42 index--;
43 }
44
45 if(ctrIndex < 0)
46 {
47 return "";
48 }
49
50 var ampIntex = search.indexOf("&", ctrIndex);
51 var value;
52 if(ampIntex > -1)
53 {
54 value = search.substring(ctrIndex + 1,
55 search.indexOf("&", ctrIndex));
56 }
57 else
58 {
59 value = search.substring(ctrIndex + 1);
60 }
61
62 return unescape(value);
63 }