wdgtH m  stopTimer 1 false btnStop_Update(); connection 60 true checkConnection(); Resources/about_freetime.png Arial 10 -500 141 #ffffff #000000 0 4  rgHPNG  IHDR6tEXtSoftwareAdobe ImageReadyqe<IDATx_e^g0Ph BPQՠ+DBfu11A CQPcԠ.Y\݄.Y\MKiigڙ>gNLgz='y29g;a -@`)j.f ը`'*bM_oPEZ^z !/iֱj}R:^ XVkFҪt-W_N\66&~69}:o<|^XVHƊ9W@t/j$DrSDʀ4x/Az'7lLM",q'߾Ϧ?]ֻ::,Bqw8ɝץm_`OlLtݿڍ#2Y9q#v[]/rC/%iOȷ:LH>*B|~yt[+>cOڼ|(\}zS6Tke݊||jO8ȟZŲtŢlLWvU>z¹}5fJ_ G_M}NjG:X:;H=L r3A^G⑟c硟)>'.HyK 4>tdt'S֟|@V1-q*vawW .Wh}noil߫n򀾷jE.If>7q8uw4Qk#=^;F_FZ9A#v-}r )?67~&~8HL&;on}6w<:x.{zN+~[l}̻ >/ܯi cy9y=G܊ aؖҖvga}zSk7Wk۷u>ϻJt;5?O|?w>&}3D`g G2k%?2XS>^mm *1Q:HZtxUk_˿cņ2nS.3~ rll>۾y:x'Gn9gSo(v&6eK[7RM* qOoHs<.؝Zw!NQ̠djyp}"\ǜwc2bdS@~D>u}yoLKۼan?3Dp6roObl|l8>c>/nmӯ_cpx *7bR7|P߼}>{tx!m=QqAi⁳wm8صsǣsvxĆ}Ue8/= qFb~f>گOA}4Ծgpto.ާZ`}s: -nLsP)8 qX[q\$ yrk)>vxr9xn7>0}-H|-Nc> b_NeW~=tT'qJO8La`AH? cjUډ|UĢ='vD\xN&"vYdo]?0/;xMƈ@GLqUvXTVqz;V\-ەi!~3Y'3@F:Y "o/8krj]U^\7}W؅>|ev:PA]>9('NsA9=oWWjkzZTK2 /gB@`):oe @@@@?D  ,a.$  ,a.$  ,a.$ \ @@s/&@@@@:L  x0 sN @9 =4^L  x0 @7 @@s/&@@@@膳0 sN p&@@@@膳0 @7 @@s/&@@@@膳0 @7 @@,,L  ga`@@n8  tYX@@@9`@@n8  tYX@ @9 tYX@@@9`@@n8  =4^L  x0 sN @9 =4^L  u @@@9`@@@@  ,a.$  ,a.$  ,a.$  JtL   +  4 N`:if^c pxLhx:% 8:j2i/xk4K@~6Tk^'RK뢢.^:v߾:eK{'цjVh݊f9Le9δc鐗 4S=C:"Hȡt7thlbj8XuDo;P~On_qUZ%w'vOWjCI=1uF`T7u+Wu_`:>OJo95uD<[7n@z@D3M7۾?}SkӵkKWqu￧w}#]ţ2$yV@ψ4`4S]V Hmf_ 0) { lblPrompt1.visible = true; cboProjects.visible = true; frmMain.height = 450; btnProjects.visible = true; // btnEstimates.visible = true; cboActivities.visible = true; // btnActivities.visible = true; cboStartTimeHour.visible = true; cboStartTimeMinute.visible = true; cboEndTimeHour.visible = true; cboEndTimeMinute.visible = true; cboAMPM.visible = true; cboAMPM1.visible = true; btnStart.visible = true; btnStop.visible = true; //txtStartTime.visible = true; // txtEndTime.visible = true; // btnDuration.visible = true; btnSave.visible = true; // Hour.visible = true; // txtEndTime.visible = true; txtDuration.visible = true; txtNotes.visible = true; //lblPrompt5.visible = true; //frmMain.width = 200; lblProjects.visible = true; lblActivities.visible = true; lblStartTime.visible = true; lblEndTime.visible = true; lblDuration.visible = true; lblNotes.visible = true; if(GetEstimates()) { topPosition = 50; cboEstimates.visible = true; lblEstimates.visible = true; cboProjects.top = topPosition; lblProjects.top = topPosition - 20; topPosition += 50; cboEstimates.top = topPosition; lblEstimates.top = topPosition - 20; topPosition += 50; cboActivities.top = topPosition; lblActivities.top = topPosition - 20; topPosition += 50; btnStart.top = topPosition; lblStartTime.top = topPosition - 20; // txtStartTime.top = topPosition; cboStartTimeHour.top = topPosition; cboStartTimeMinute.top = topPosition; cboAMPM.top = topPosition; topPosition += 50; btnStop.top = topPosition; lblEndTime.top = topPosition - 20; // txtEndTime.top = topPosition; cboEndTimeHour.top = topPosition; cboEndTimeMinute.top = topPosition; cboAMPM1.top = topPosition; txtDuration.top = topPosition; lblDuration.top = topPosition - 20; topPosition += 50; txtNotes.top = topPosition; lblNotes.top = topPosition - 20; btnSave.top = topPosition + 56; } else { topPosition = 50; frmMain.height = 400; cboEstimates.visible = false; lblEstimates.visible = false; cboProjects.top = topPosition; lblProjects.top = topPosition - 20; topPosition += 50; cboActivities.top = topPosition; lblActivities.top = topPosition - 20; topPosition += 50; btnStart.top = topPosition; lblStartTime.top = topPosition - 20; // txtStartTime.top = topPosition; cboStartTimeHour.top = topPosition; cboStartTimeMinute.top = topPosition; cboAMPM.top = topPosition; topPosition += 50; btnStop.top = topPosition; lblEndTime.top = topPosition - 20; // txtEndTime.top = topPosition; cboEndTimeHour.top = topPosition; cboEndTimeMinute.top = topPosition; cboAMPM1.top = topPosition; txtDuration.top = topPosition; lblDuration.top = topPosition - 20; topPosition += 50; txtNotes.top = topPosition; lblNotes.top = topPosition - 20; btnSave.top = topPosition + 56; } } else { cboProjects.visible = true; lblPrompt1.visible = true; btnProjects.visible = true; cboStartTimeHour.visible = false; cboStartTimeMinute.visible = false; cboEndTimeHour.visible = false; cboEndTimeMinute.visible = false; cboAMPM.visible = false; cboAMPM1.visible = false; cboEstimates.visible = false; // btnEstimates.visible = false; cboActivities.visible = false; // btnActivities.visible = false; btnStart.visible = false; btnStop.visible = false; // txtStartTime.visible = false; // txtEndTime.visible = false; // btnDuration.visible = false; btnSave.visible = false; //txtEndTime.visible = false; // txtDuration.visible = false; txtNotes.visible = false; // lblPrompt5.visible = false; frmMain.height = 150; lblProjects.visible = false; lblEstimates.visible = false; lblActivities.visible = false; lblStartTime.visible = false; lblEndTime.visible = false; lblDuration.visible = false; lblNotes.visible = false; } } else{ cboProjects.visible = false; btnProjects.visible = false; cboEstimates.visible = false; // btnEstimates.visible = false; cboActivities.visible = false; // btnActivities.visible = false; cboStartTimeHour.visible = false; cboStartTimeMinute.visible = false; cboEndTimeHour.visible = false; cboEndTimeMinute.visible = false; cboAMPM.visible = false; cboAMPM1.visible = false; btnStart.visible = false; btnStop.visible = false; // txtStartTime.visible = false; //txtEndTime.visible = false; // btnDuration.visible = false; btnSave.visible = false; //txtEndTime.visible = false; txtDuration.visible = false; txtNotes.visible = false; // lblPrompt5.visible = false; frmMain.height = 150; lblPrompt1.visible = false; lblProjects.visible = false; lblEstimates.visible = false; lblActivities.visible = false; lblStartTime.visible = false; lblEndTime.visible = false; lblDuration.visible = false; lblNotes.visible = false; } } /** * Handles cboCombo_onSelectedIndexChanged event for a combobox. */ function cboProjects_onSelectedIndexChanged(sender, e) { log("cboProjects_onSelectedIndexChanged"); if(cboProjects.items.item(cboProjects.selectedIndex)['project_id'] == '0'){ cboProjects.selectedIndex++; } var currentProject = cboProjects.items.item(cboProjects.selectedIndex); var currentProjectLabel = currentProject[0]; var ct = new Date(); currentProjectId = currentProject['project_id']; log(currentProjectId); everything_visibility('on'); GetActivities(); currentStartTimeHourId = 0; currentStartTimeMinuteId = 0; currentAMPMId = 0; currentEndTimeHourId = 0; currentEndTimeMinuteId = 0; currentAMPM1Id = 0; todayDate = formatDate(ct); stopTimer.ticking = false; cboStartTimeHour.enabled=true; cboStartTimeMinute.enabled=true; cboEndTimeHour.enabled=true; cboEndTimeMinute.enabled=true; cboAMPM.enabled=true; cboAMPM1.enabled=true; btnStop.enabled = false; btnStart.enabled = true; firstTime = true; ShowEndTimeHour(); ShowEndTimeMinute(); ShowAMPM1(); ShowStartTimeHour(); ShowStartTimeMinute(); ShowAMPM(); firstTime = false; } /** * Handles cboCombo_onSelectedIndexChanged event for a combobox. */ function cboActivities_onSelectedIndexChanged(sender, e) { log("cboActivities_onSelectedIndexChanged"); log("selected index: " + cboActivities.selectedIndex); if(cboActivities.items.item(cboActivities.selectedIndex)['activity_id'] == '0'){ cboActivities.selectedIndex++; } var currentActivity = cboActivities.items.item(cboActivities.selectedIndex); var currentActivityLabel = currentActivity[0]; currentActivityId = currentActivity['activity_id']; log(currentActivityId); } function cboEstimates_onSelectedIndexChanged(sender, e) { log("cboEstimates_onSelectedIndexChanged"); log("selected index: " + cboEstimates.selectedIndex); if(cboEstimates.items.item(cboEstimates.selectedIndex)['estimate_id'] == '0'){ cboEstimates.selectedIndex++; } var currentEstimate = cboEstimates.items.item(cboEstimates.selectedIndex); var currentEstimateLabel = currentEstimate[0]; currentEstimateId = currentEstimate['estimate_id']; log(currentEstimateId); } function dump(arr,level) { var dumped_text = ""; if(!level) level = 0; //The padding given at the beginning of the line. var level_padding = ""; for(var j=0;j \"" + value + "\"\n"; } } } else { //Stings/Chars/Numbers etc. dumped_text = "===>"+arr+"<===("+typeof(arr)+")"; } return dumped_text; } function cboStartTimeHour_onSelectedIndexChanged(sender, e) { log("cboStartTimeHour_onSelectedIndexChanged"); log("selected index: " + cboStartTimeHour.selectedIndex); if(firstTime == false) { //if(btnDuration_onClick(sender,e) == false || !(cboStartTimeHour.enabled)) // { // cboStartTimeHour.selectedIndex = currentStartTimeHourId; // } // else // { if(cboStartTimeHour.items.item(cboStartTimeHour.selectedIndex)['value'] == '0'){ cboStartTimeHour.selectedIndex++; } var currentStartTimeHour = cboStartTimeHour.items.item(cboStartTimeHour.selectedIndex); var currentStartTimeHourLabel = currentStartTimeHour[0]; currentStartTimeHourId = currentStartTimeHour['value']; //} } log(currentStartTimeHourId); } function cboStartTimeMinute_onSelectedIndexChanged(sender, e) { log("cboStartTimeMinute_onSelectedIndexChanged"); log("selected index: " + cboStartTimeMinute.selectedIndex); if(firstTime == false) { //if(btnDuration_onClick(sender,e) == false || !(cboStartTimeMinute.enabled)) // { // cboStartTimeMinute.selectedIndex = currentStartTimeMinuteId; // } // else // { if(cboStartTimeMinute.items.item(cboStartTimeMinute.selectedIndex)['value'] == '0'){ cboStartTimeMinute.selectedIndex++; } var currentStartTimeMinute = cboStartTimeMinute.items.item(cboStartTimeMinute.selectedIndex); var currentStartTimeMinuteLabel = currentStartTimeMinute[0]; currentStartTimeMinuteId = currentStartTimeMinute['value']; // } } } function cboEndTimeHour_onSelectedIndexChanged(sender, e) { log("cboEndTimeHour_onSelectedIndexChanged"); log("selected index: " + cboEndTimeHour.selectedIndex); if(firstTime == false) { //if(btnDuration_onClick(sender,e) == false) // { // cboEndTimeHour.selectedIndex = currentEndTimeHourId; // } // else // { if(cboEndTimeHour.items.item(cboEndTimeHour.selectedIndex)['value'] == '0'){ cboEndTimeHour.selectedIndex++; } var currentEndTimeHour = cboEndTimeHour.items.item(cboEndTimeHour.selectedIndex); var currentEndTimeHourLabel = currentEndTimeHour[0]; currentEndTimeHourId = currentEndTimeHour['value']; // } } } function cboEndTimeMinute_onSelectedIndexChanged(sender, e) { log("cboEndTimeMinute_onSelectedIndexChanged"); log("selected index: " + cboEndTimeMinute.selectedIndex); if(firstTime == false) { //if(btnDuration_onClick(sender,e) == false) // { // cboEndTimeMinute.selectedIndex = currentEndTimeMinuteId; // // } // else // { if(cboEndTimeMinute.items.item(cboEndTimeMinute.selectedIndex)['value'] == '0'){ cboEndTimeMinute.selectedIndex++; } var currentEndTimeMinute = cboEndTimeMinute.items.item(cboEndTimeMinute.selectedIndex); var currentEndTimeMinuteLabel = currentEndTimeMinute[0]; currentEndTimeMinuteId = currentEndTimeMinute['value']; //} } } function cboAMPM_onSelectedIndexChanged(sender, e) { log("cboAMPM_onSelectedIndexChanged"); log("selected index: " + cboAMPM.selectedIndex); if(firstTime == false) { //if(btnDuration_onClick(sender,e) == false || !(cboAMPM.enabled)) // { // cboAMPM.selectedIndex = currentAMPMId; // } // else // { var currentAMPM = cboAMPM.items.item(cboAMPM.selectedIndex); var currentAMPMLabel = currentAMPM[0]; currentAMPMId = cboAMPM.selectedIndex; // } } log(currentAMPMId); } function cboAMPM1_onSelectedIndexChanged(sender, e) { log("cboAMPM1_onSelectedIndexChanged"); log("selected index: " + cboAMPM1.selectedIndex); if(firstTime == false) { //if(btnDuration_onClick(sender,e) == false) //{ // cboAMPM1.selectedIndex = currentAMPM1Id; // } // else // { var currentAMPM1 = cboAMPM1.items.item(cboAMPM1.selectedIndex); var currentAMPM1Label = currentAMPM1[0]; currentAMPM1Id = cboAMPM1.selectedIndex; // } } log(currentAMPM1Id); } /** * Handles onClick event for button. */ /*function btnClose_onClick(sender, e) { log("btnClose_onClick"); frmMain.dialogResult = Yahoo.Controls.DialogResult.Cancel; doClose(); } */ /** * Handles onClick event for button. */ function btnSave_onClick(sender, e) { log("btnSave_onClick"); frmMain.dialogResult = Yahoo.Controls.DialogResult.Submit; // stopTimer.Ticking = false; if(cboStartTimeHour.items.item(cboStartTimeHour.selectedIndex)['value'] == '0' || cboStartTimeMinute.items.item(cboStartTimeMinute.selectedIndex)['value'] == '0' || cboEndTimeHour.items.item(cboEndTimeHour.selectedIndex)['value'] == '0' || cboEndTimeMinute.items.item(cboEndTimeMinute.selectedIndex)['value'] == '0') { alert("Please Enter Times for this task"); return false;} else { if(btnDuration_onClick(sender,e) == false) { alert("End Time cannot be earlier than Start Time"); return false;} } if(checkConnection() == false) { alert("You are not connected to server"); return false;} // Grab all the values in the form var staff_id = escape(preferences.username.value); var project_id = currentProjectId; var activity_id = currentActivityId; var estimate_id = currentEstimateId; //var start_time = Hour.text; var start_time;//= txtStartTime; // wip var end_time;// = txtEndTime; var notes = txtNotes.text; // Calculate what the local timestamp is in UTC time. // We convert to UTC for storage purposes as we need a uniform standard time. // This is transparent to users, as they only ever view times in their local timezone. var currentTime = new Date(); var my_timezone_offset = currentTime.getTimezoneOffset(); //var todayDate = formatDate(currentTime); start_time = cboStartTimeHour.selectedIndex + "-" + cboStartTimeMinute.selectedIndex + "-" + cboAMPM.selectedIndex; end_time = cboEndTimeHour.selectedIndex + "-" + cboEndTimeMinute.selectedIndex + "-" + cboAMPM1.selectedIndex; log("" + staff_id + "," + project_id + "," + activity_id + "," + start_time + "," + end_time + "," + notes + "," + my_timezone_offset + "," + todayDate + "," + estimate_id + ""); var request = new XMLHttpRequest(); var url = deployDomain; var params = "action=save&user=" + staff_id + "&project_id=" + project_id + "&activity_id=" + activity_id + "&start_time=" + start_time + "&end_time=" + end_time + "¬es=" + escape(notes) + "&tzoffset=" + my_timezone_offset + "&date=" + todayDate + "&estimate_id=" + estimate_id; request.open("POST", url , true); //Send the proper header information along with the request request.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); request.setRequestHeader("Content-length", params.length); request.setRequestHeader("Connection", "close"); request.send(params); log("Saved"); // Reset all form elements to blank. cboProjects.selectedIndex = 0; cboActivities.selectedIndex = 0; cboEstimates.selectedIndex = 0; cboStartTimeHour.selectedIndex = 0; cboStartTimeMinute.selectedIndex = 0; cboEndTimeHour.selectedIndex = 0; cboEndTimeMinute.selectedIndex = 0; cboAMPM.selectedIndex = 0; cboAMPM1.selectedIndex = 0; //txtEndTime.text = ""; txtDuration.text = ""; txtNotes.text = ""; frmMain.height = 150; } // Projects Refresh on click function btnProjects_onClick(sender, e){ log("btnProjects_onClick"); cboProjects.items.clear(); cboProjects_Refresh(); cboProjects_onSelectedIndexChanged(sender, e); } function cboProjects_Refresh(){ cboProjects.items.clear(); // Connect to server to pull projects var request = new XMLHttpRequest(); request.open("GET", deployDomain + "?action=projects_win&user="+escape(preferences.username.value), false); request.send(); try { var doc = request.responseXML; if(request.status == 200 && doc != null) { var titleNodes = doc.evaluate("select/option"); var myprojects = new Array(); for(var i = 0; i < titleNodes.length; i++) { print("Project " + (i+1) + ": " + titleNodes.item(i).firstChild.data); print("Values ", titleNodes.item(i).getAttribute('value')); myprojects[i] = new Array(); myprojects[i][0] = titleNodes.item(i).firstChild.data; myprojects[i]['project_id'] = titleNodes.item(i).getAttribute('value'); cboProjects.items.add(myprojects[i]); } } else { print("An error occurred. Response status: (" + request.status + ") " + request.statusText); } } catch(e) { print("An error occurred: " + e); } cboProjects.selectedIndex = 0; } /** * Handles onClick event for Start button. */ function btnStart_onClick(sender, e) { log("btnStart_onClick"); var TempName; var fieldname;//= txtStartTime; // Set all time fields to blank var currentTime = new Date(); // Get Local Time for display purposes var hours = currentTime.getHours(); var minutes = currentTime.getMinutes(); if(hours > 11) { cboAMPM.selectedIndex = 1; if(hours > 12) cboStartTimeHour.selectedIndex = hours - 12; else {cboStartTimeHour.selectedIndex = hours;} } else { cboAMPM.selectedIndex = 0; if(hours == 0) cboStartTimeHour.selectedIndex = 12; else { cboStartTimeHour.selectedIndex = hours; } } cboStartTimeMinute.selectedIndex = minutes + 1; btnStop_Update(); stopTimer.ticking = true; btnStart.enabled = false; btnStop.enabled = true; cboStartTimeHour.enabled = false; cboStartTimeMinute.enabled = false; cboAMPM.enabled = false; cboEndTimeHour.enabled = false; cboEndTimeMinute.enabled = false; cboAMPM1.enabled = false; // btnDuration_onClick(sender, e); /*log("btnStart_onClick"); var TempName; var fieldname = txtStartTime; // Set all time fields to blank txtStartTime.text = ""; txtEndTime.text = ""; txtDuration.text = ""; var currentTime = new Date(); // Get Local Time for display purposes var hours = currentTime.getHours(); var minutes = currentTime.getMinutes(); if(minutes < 10){ minutes = "0" + minutes; } TempName = hours + ":" + minutes + " "; if(hours > 11){ fieldname.text = TempName + "PM"; } else { fieldname.text = TempName + "AM"; } */ // btnDuration_onClick(sender, e); } /** * Handles onClick event for Stop button. */ function btnStop_onClick(sender, e) { //alert(dump(sender)); log("btnStart_onClick"); stopTimer.ticking = false; /* var currentTime = new Date(); // Get Local Time for display purposes var hours = currentTime.getHours(); var minutes = currentTime.getMinutes(); if(hours > 11) { if(hours > 12)cboEndTimeHour.selectedIndex = hours - 12; else cboEndTimeHour.selectedIndex = hours; cboAMPM1.selectedIndex = 1; } else { cboEndTimeHour.selectedIndex = hours; cboAMPM1.selectedIndex = 0; } cboEndTimeMinute.selectedIndex = minutes; */ btnStart.enabled = true; btnStop.enabled = false; cboStartTimeHour.enabled = true; cboStartTimeMinute.enabled = true; cboAMPM.enabled = true; cboEndTimeHour.enabled = true; cboEndTimeMinute.enabled = true; cboAMPM1.enabled = true; btnDuration_onClick(sender, e); } function btnStop_Update() { //alert(dump(sender)); log("btnStop_Update"); var currentTime = new Date(); // Get Local Time for display purposes var hours = currentTime.getHours(); var minutes = currentTime.getMinutes(); if(hours > 11) { cboAMPM1.selectedIndex = 1; if(hours > 12)cboEndTimeHour.selectedIndex = hours - 12; else {cboEndTimeHour.selectedIndex = hours;} } else { cboAMPM1.selectedIndex = 0; if(hours == 0) cboEndTimeHour.selectedIndex = 12; else { cboEndTimeHour.selectedIndex = hours; } } cboEndTimeMinute.selectedIndex = minutes + 1; //btnDuration_onClick(sender, e); } /** * Handles onClick event for Duration button. */ function btnDuration_onClick(sender, e) { log("btnDuration_onClick"); var AMPM = cboAMPM1.selectedIndex - cboAMPM.selectedIndex; var startTime = 0,endTime = 0; if(cboAMPM.selectedIndex == 0) // start time is AM { if(cboStartTimeHour.selectedIndex != 12) startTime = cboStartTimeHour.selectedIndex * 60 + cboStartTimeMinute.selectedIndex; else {startTime = cboStartTimeMinute.selectedIndex;} } else // start Time is PM { if(cboStartTimeHour.selectedIndex != 12) startTime = ((cboStartTimeHour.selectedIndex + 12) * 60) + (cboStartTimeMinute.selectedIndex); else {startTime = (cboStartTimeHour.selectedIndex * 60) + cboStartTimeMinute.selectedIndex;} } if(cboAMPM1.selectedIndex == 0) // end Time is AM { if(cboEndTimeHour.selectedIndex != 12) endTime = cboEndTimeHour.selectedIndex * 60 + cboEndTimeMinute.selectedIndex; else {endTime = cboEndTimeMinute.selectedIndex;} } else // end Time is PM { if(cboEndTimeHour.selectedIndex != 12) endTime = ((cboEndTimeHour.selectedIndex + 12) * 60) + (cboEndTimeMinute.selectedIndex); else {endTime = (cboEndTimeHour.selectedIndex * 60) + cboEndTimeMinute.selectedIndex;} } var duration = endTime - startTime; var durationText = parseInt(duration / 60 ) + ":" + (duration % 60); // do not check for end time is greater than starter time if any of the times are HH or MM if(cboStartTimeHour.items.item(cboStartTimeHour.selectedIndex)['value'] == '0' || cboStartTimeMinute.items.item(cboStartTimeMinute.selectedIndex)['value'] == '0' || cboEndTimeHour.items.item(cboEndTimeHour.selectedIndex)['value'] == '0' || cboEndTimeMinute.items.item(cboEndTimeMinute.selectedIndex)['value'] == '0') { if(duration < 0) { cboAMPM1.selectedIndex = cboAMPM.selectedIndex; if(cboStartTimeHour.selectedIndex > cboEndTimeHour.selectedIndex) cboEndTimeHour.selectedIndex = cboStartTimeHour.selectedIndex; if(cboStartTimeMinute.selectedIndex > cboEndTimeMinute.selectedIndex) cboEndTimeMinute.selectedIndex = cboStar tTimeMinute.selectedIndex; } } else { if(duration < 0) { if(stopTimer.ticking == true) // they forgot to stop the timer and now the next day has begun { stopTimer.ticking = false; btnStop_onClick(sender,e); cboEndTimeHour.selectedIndex = 11; cboEndTimeMinute.selectedIndex = 60; cboAMPM1.selectedIndex = 1; alert("The device has timed out"); } else { //alert("End Time cannot be earlier than Start Time"); txtDuration.text = ""; return false; } } txtDuration.text = durationText; return true; } } function GetActivities(){ cboActivities.items.clear(); // Connect to server to pull projects var request = new XMLHttpRequest(); request.open("GET", deployDomain + "?action=tasks_win&user="+ escape(preferences.username.value), false); request.send(); try { var doc = request.responseXML; if(request.status == 200 && doc != null){ var ActivityNodes = doc.evaluate("select/option"); if(ActivityNodes.length > 0) projectHasEstimates = true; var myActivities = new Array(); for(var i = 0; i < ActivityNodes.length; i++) { print("Activity " + (i+1) + ": " + ActivityNodes.item(i).firstChild.data); //print("Activity ID ", ActivityNodes.item(i).getAttribute('value')); myActivities[i] = new Array(); myActivities[i][0] = ActivityNodes.item(i).firstChild.data; myActivities[i]['activity_id'] = ActivityNodes.item(i).getAttribute('value'); cboActivities.items.add(myActivities[i]); } } else { print("An error occurred. Response status: (" + request.status + ") " + request.statusText); } } catch(e) { print("An error occurred: " + e); } cboActivities.selectedIndex = 0; } function GetEstimates(){ //alert(deployDomain + "widget_v1_4.php?action=estimates&project_id="+ currentProjectId +"&user="+escape(preferences.username.value)); cboEstimates.items.clear(); // Connect to server to pull projects var request = new XMLHttpRequest(); request.open("GET", deployDomain + "?action=estimates&project_id="+ currentProjectId +"&user="+escape(preferences.username.value), false); request.send(); try { var doc = request.responseXML; if(request.status == 200 && doc != null) { var titleNodes = doc.evaluate("select/option"); var myEstimates = new Array(); for(var i = 0; i < titleNodes.length; i++) { print("Estimates " + (i+1) + ": " + titleNodes.item(i).firstChild.data); print("Values ", titleNodes.item(i).getAttribute('value')); myEstimates[i] = new Array(); myEstimates[i][0] = titleNodes.item(i).firstChild.data; myEstimates[i]['estimate_id'] = titleNodes.item(i).getAttribute('value'); cboEstimates.items.add(myEstimates[i]); } } else { print("An error occurred. Response status: (" + request.status + ") " + request.statusText); if(doc == null) print("doc was null"); return 2; } } catch(e) { print("An error occurred: " + e); return 2; } cboEstimates.selectedIndex = 0; if(titleNodes.length > 1) return true; return false; } function showLoggedMessage($status) { if($status == "online") { lblPrompt1.text = "user: " + userName; userLength = lblPrompt1.text.length; lblPrompt1.left = frmWidth - 80.0 - (userLength* 2.5); } else { lblPrompt1.text = "user: " + userName + "(offline)"; userLength = lblPrompt1.text.length; lblPrompt1.left = frmWidth - 80.0 - (userLength* 2.5); } } function ShowStartTimeHour(){ //alert(deployDomain + "widget_v1_4.php?action=estimates&project_id="+ currentProjectId +"&user="+escape(preferences.username.value)); cboStartTimeHour.items.clear(); // Connect to server to pull projects var myStartTimeHour = new Array(); myStartTimeHour[0] = new Array("HH"); myStartTimeHour[0]['value'] = 0; cboStartTimeHour.items.add(myStartTimeHour[0]); for(var i = 1; i <= 12 ; i++) { myStartTimeHour[i] = new Array(); if(i < 10) myStartTimeHour[i][0] = "0" + i; else { myStartTimeHour[i][0] = i; } myStartTimeHour[i]['value'] = i; cboStartTimeHour.items.add(myStartTimeHour[i]); } cboStartTimeHour.selectedIndex = 0; } function ShowStartTimeMinute(){ //alert(deployDomain + "widget_v1_4.php?action=estimates&project_id="+ currentProjectId +"&user="+escape(preferences.username.value)); cboStartTimeMinute.items.clear(); // Connect to server to pull projects var myStartTimeMinute = new Array(); myStartTimeMinute[0] = new Array("MM"); myStartTimeMinute[0]['value'] = 0; cboStartTimeMinute.items.add(myStartTimeMinute[0]); for(var i = 0; i < 60 ; i++) { print(i); myStartTimeMinute[i] = new Array(); if(i < 10) myStartTimeMinute[i][0] = "0" + i; else { myStartTimeMinute[i][0] = i; } myStartTimeMinute[i]['value'] = i + 1; cboStartTimeMinute.items.add(myStartTimeMinute[i]); } cboStartTimeMinute.selectedIndex = 0; } function ShowEndTimeHour(){ //alert(deployDomain + "widget_v1_4.php?action=estimates&project_id="+ currentProjectId +"&user="+escape(preferences.username.value)); cboEndTimeHour.items.clear(); // Connect to server to pull projects var myEndTimeHour = new Array(); myEndTimeHour[0] = new Array("HH"); myEndTimeHour[0]['value'] = 0; cboEndTimeHour.items.add(myEndTimeHour[0]); for(var i = 1; i <= 12 ; i++) { print(i); myEndTimeHour[i] = new Array(); if(i < 10) myEndTimeHour[i][0] = "0" + i; else { myEndTimeHour[i][0] = i; } myEndTimeHour[i]['value'] = i; cboEndTimeHour.items.add(myEndTimeHour[i]); } cboEndTimeHour.selectedIndex = 0; } function ShowEndTimeMinute(){ //alert(deployDomain + "widget_v1_4.php?action=estimates&project_id="+ currentProjectId +"&user="+escape(preferences.username.value)); cboEndTimeMinute.items.clear(); // Connect to server to pull projects var myEndTimeMinute = new Array(); myEndTimeMinute[0] = new Array("MM"); myEndTimeMinute[0]['value'] = 0; cboEndTimeMinute.items.add(myEndTimeMinute[0]); for(var i = 0; i < 60 ; i++) { print(i); myEndTimeMinute[i] = new Array(); if(i < 10) myEndTimeMinute[i][0] = "0" + i; else { myEndTimeMinute[i][0] = i; } myEndTimeMinute[i]['value'] = i + 1; cboEndTimeMinute.items.add(myEndTimeMinute[i]); } cboEndTimeMinute.selectedIndex = 0; } function ShowAMPM(){ //alert(deployDomain + "widget_v1_4.php?action=estimates&project_id="+ currentProjectId +"&user="+escape(preferences.username.value)); cboAMPM.items.clear(); // Connect to server to pull projects var myAMPM = new Array(); myAMPM[0] = new Array("AM"); myAMPM[1] = new Array("PM"); cboAMPM.items.add(myAMPM[0]); cboAMPM.items.add(myAMPM[1]); cboAMPM.selectedIndex = 0; } function ShowAMPM1(){ //alert(deployDomain + "widget_v1_4.php?action=estimates&project_id="+ currentProjectId +"&user="+escape(preferences.username.value)); cboAMPM1.items.clear(); // Connect to server to pull projects var myAMPM1 = new Array(); myAMPM1[0] = new Array("AM"); myAMPM1[1] = new Array("PM"); cboAMPM1.items.add(myAMPM1[0]); cboAMPM1.items.add(myAMPM1[1]); cboAMPM1.selectedIndex = 0; } /*---------------------------------------------------------------------*/ // Private code /*---------------------------------------------------------------------*/ /** * Closes the widget. */ function doClose() { closeWidget(); } /** * Does a layout of the controls on the form. */ /*function doLayout() { btnClose.left = frmMain.clientSize.width - btnClose.width - 8; btnClose.top = frmMain.clientSize.height - btnClose.height - 8; btnSave.left = 8; btnSave.top = frmMain.clientSize.height - btnSave.height - 8; }*/ /** * Main startup code. */ function checkConnection() { print("checking connection"); var request = new XMLHttpRequest(); request.open("GET", deployDomain + "?action=check_connection", false); request.send(); try { var doc = request.responseXML; if(request.status == 200 && doc != null) { showLoggedMessage("online"); return true; } else { print("An error occurred. Response status: (" + request.status + ") " + request.statusText); if(doc == null) print("doc was null"); showLoggedMessage("offline"); return false; } //alert(dump(doc),0); } catch(e) { print("An error occurred: " + e); showLoggedMessage("offline"); return false; } } function main() { log("main()"); var lang; // Create a named theme theme = new Yahoo.Controls.Theme("Theme"); log("theme preference: " + preferences.colorPref.value); if(preferences.colorPref.value == ''){ theme.loadTheme("FreeTime"); } else { theme.loadTheme(preferences.colorPref.value); } // Optionally you could use the default theme by passing null to a control such as Form //theme = null; // Listen to theme changed events theme.addEventHandler(theme_onThemeChanged, "ThemeChanged"); // Create controls frmMain = new Yahoo.Controls.Form(theme); frmMain.width = frmWidth; // frmMain.width = 400; frmMain.height = 150; frmMain.left = (screen.availWidth / 2) - (frmMain.width / 2); frmMain.top = (screen.availHeight / 2) - (frmMain.height / 2); //frmMain.formBorderStyle = Yahoo.Controls.FormBorderStyle.Sizable; frmMain.minimumSize = new Yahoo.Drawing.Size(frmWidth,150); frmMain.maximumSize = new Yahoo.Drawing.Size(frmWidth,450); frmMain.addEventHandler(frmMain_onClosing, "Closing"); frmMain.addEventHandler(frmMain_onClosed, "Closed"); frmMain.addEventHandler(frmMain_onResize, "Resize"); frmMain.window.level = "topmost"; lblPrompt1 = new Yahoo.Controls.Label(frmMain.theme); lblPrompt1.autoSize = true; lblPrompt1.top = 0; lblPrompt1.height = 14; // Listen to changed preferences widget.onPreferencesChanged = function( event ) { theme.loadTheme(preferences.colorPref.value); //frmMain.theme = sender; if(preferences.username.value == ""){ lblPrompt1.text = "Please login with your username and password."; everything_visibility('off'); showWidgetPreferences(); } else { // Okay, so they have entered a username, lets make sure it's correct. var request = new XMLHttpRequest(); var url = deployDomain; var params = "action=check_user&user=" + escape(preferences.username.value) + "&pass=" + escape(preferences.password.value) + ""; request.open("POST", url , true); //Send the proper header information along with the request request.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); request.setRequestHeader("Content-length", params.length); request.setRequestHeader("Connection", "close"); request.onreadystatechange = function() {//Call a function when the state changes. if(request.readyState == 4 && request.status == 200) { var myResponse = request.responseText; log(myResponse); if(myResponse == "yes"){ userName = preferences.username.value; showLoggedMessage("online"); everything_visibility('on'); cboProjects_Refresh(); } else { lblPrompt1.text = "Please login with your username and password."; everything_visibility('off'); showWidgetPreferences(); } } } request.send(params); } } // Project Button for refresh btnProjects = new Yahoo.Controls.Button(frmMain.theme); btnProjects.addEventHandler(btnProjects_onClick, "Click"); btnProjects.text = "Refresh"; btnProjects.left = 200; btnProjects.top = topPosition - 30; btnProjects.width = 100; btnProjects.height = 23; //btnProjects.background = "refresh.png"; //btnProjects.foreColor = "#00cc00"; btnProjects.visible = false; // Estimates Button for refresh /*btnEstimates = new Yahoo.Controls.Button(frmMain.theme); //btnEstimates.addEventHandler(btnEstimates_onClick, "Click"); btnEstimates.text = "Estimate"; btnEstimates.left = 300; btnEstimates.top = 60; btnEstimates.width = 71; btnEstimates.height = 23; btnEstimates.visible = false;*/ // Activity Button for refresh /*btnActivities = new Yahoo.Controls.Button(frmMain.theme); btnActivities.text = "Activity"; btnActivities.left = 300; btnActivities.top = 96; btnActivities.width = 71; btnActivities.height = 23; btnActivities.visible = false;*/ // Start Button for start-time /*// Duration Button for duration-time btnDuration = new Yahoo.Controls.Button(frmMain.theme); btnDuration.addEventHandler(btnDuration_onClick, "Click"); btnDuration.text = "Duration"; btnDuration.left = 300; btnDuration.top = 246; btnDuration.width = 71; btnDuration.height = 23; btnDuration.visible = false;*/ // Projects Select List cboProjects = new Yahoo.Controls.ComboBox(frmMain.theme); cboProjects.addEventHandler(cboProjects_onSelectedIndexChanged, "SelectedIndexChanged"); cboProjects.left = 8; cboProjects.top = topPosition; cboProjects.width = 290; cboProjects.height = 21; cboProjects.visible = false; cboProjects_Refresh(); lblProjects = new Yahoo.Controls.Label(frmMain.theme); lblProjects.autoSize = true; lblProjects.left = 8; lblProjects.top = topPosition - 20; lblProjects.height = 14; lblProjects.text = "Project"; //lblProjects.foreColor = "#9ba5bd"; //lblProjects.style = "bold"; lblProjects.visible = false; // Estimates Select List cboEstimates = new Yahoo.Controls.ComboBox(frmMain.theme); cboEstimates.addEventHandler(cboEstimates_onSelectedIndexChanged, "SelectedIndexChanged"); cboEstimates.left = 8; cboEstimates.top = topPosition + 50; cboEstimates.width = 290; cboEstimates.height = 21; cboEstimates.visible = false; //cboProjects_Refresh(); lblEstimates = new Yahoo.Controls.Label(frmMain.theme); lblEstimates.autoSize = true; lblEstimates.left = 8; lblEstimates.top = topPosition + 30; lblEstimates.height = 14; lblEstimates.text = "Task"; lblEstimates.foreColor = "#9ba5bd"; lblEstimates.visible = false; // Activities Select List cboActivities = new Yahoo.Controls.ComboBox(frmMain.theme); cboActivities.addEventHandler(cboActivities_onSelectedIndexChanged, "SelectedIndexChanged"); cboActivities.left = 8; cboActivities.top = topPosition; cboActivities.width = 290; cboActivities.height = 21; cboActivities.visible = false; lblActivities = new Yahoo.Controls.Label(frmMain.theme); lblActivities.autoSize = true; lblActivities.left = 8; lblActivities.top = topPosition - 20; lblActivities.height = 14; lblActivities.text = "Activity"; lblActivities.foreColor = "#9ba5bd"; lblActivities.visible = false; topPosition += 50; btnStart = new Yahoo.Controls.Button(frmMain.theme); btnStart.addEventHandler(btnStart_onClick, "Click"); btnStart.text = "START"; btnStart.left = 8; btnStart.top = topPosition; btnStart.width = 71; btnStart.height = 23; //btnStart.foreColor = "#00cc00"; btnStart.enabled = true; btnStart.visible = false; /*txtStartTime = new Yahoo.Controls.TextBox(frmMain.theme); txtStartTime.text = ""; txtStartTime.left = 90; txtStartTime.top = topPosition; txtStartTime.width = 100; txtStartTime.height = 23; txtStartTime.visible = false;*/ lblStartTime = new Yahoo.Controls.Label(frmMain.theme); lblStartTime.autoSize = true; lblStartTime.left = 92; lblStartTime.top = topPosition - 20; lblStartTime.height = 14; lblStartTime.text = "Start Time"; lblStartTime.foreColor = "#9ba5bd"; lblStartTime.visible = false; cboStartTimeHour = new Yahoo.Controls.ComboBox(frmMain.theme); cboStartTimeHour.addEventHandler(cboStartTimeHour_onSelectedIndexChanged, "SelectedIndexChanged"); cboStartTimeHour.left = 92; cboStartTimeHour.top = topPosition; cboStartTimeHour.width = 45; cboStartTimeHour.height = 21; cboStartTimeHour.visible = false; cboStartTimeMinute = new Yahoo.Controls.ComboBox(frmMain.theme); cboStartTimeMinute.addEventHandler(cboStartTimeMinute_onSelectedIndexChanged, "SelectedIndexChanged"); cboStartTimeMinute.left = 142; cboStartTimeMinute.top = topPosition; cboStartTimeMinute.width = 45; cboStartTimeMinute.height = 21; cboStartTimeMinute.visible = false; cboAMPM = new Yahoo.Controls.ComboBox(frmMain.theme); cboAMPM.addEventHandler(cboAMPM_onSelectedIndexChanged, "SelectedIndexChanged"); cboAMPM.left = 192; cboAMPM.top = topPosition; cboAMPM.width = 45; cboAMPM.height = 21; cboAMPM.visible = false; // Stop Button for stop-time topPosition += 50; btnStop = new Yahoo.Controls.Button(frmMain.theme); btnStop.addEventHandler(btnStop_onClick, "Click"); btnStop.text = "STOP"; btnStop.left = 8; btnStop.top = topPosition; btnStop.width = 71; btnStop.height = 23; btnStop.foreColor = "#cc0000"; btnStop.enabled = false; btnStop.visible = false; cboEndTimeHour = new Yahoo.Controls.ComboBox(frmMain.theme); cboEndTimeHour.addEventHandler(cboEndTimeHour_onSelectedIndexChanged, "SelectedIndexChanged"); cboEndTimeHour.left = 92; cboEndTimeHour.top = topPosition; cboEndTimeHour.width = 45; cboEndTimeHour.height = 21; cboEndTimeHour.visible = false; cboEndTimeMinute = new Yahoo.Controls.ComboBox(frmMain.theme); cboEndTimeMinute.addEventHandler(cboEndTimeMinute_onSelectedIndexChanged, "SelectedIndexChanged"); cboEndTimeMinute.left = 142; cboEndTimeMinute.top = topPosition; cboEndTimeMinute.width = 45; cboEndTimeMinute.height = 21; cboEndTimeMinute.visible = false; cboAMPM1 = new Yahoo.Controls.ComboBox(frmMain.theme); cboAMPM1.addEventHandler(cboAMPM1_onSelectedIndexChanged, "SelectedIndexChanged"); cboAMPM1.left = 192; cboAMPM1.top = topPosition; cboAMPM1.width = 45; cboAMPM1.height = 21; cboAMPM1.visible = false; /*txtEndTime = new Yahoo.Controls.TextBox(frmMain.theme); txtEndTime.text = ""; txtEndTime.left = 90; txtEndTime.top = topPosition; txtEndTime.width = 100; txtEndTime.height = 23; txtEndTime.visible = false;*/ lblEndTime = new Yahoo.Controls.Label(frmMain.theme); lblEndTime.autoSize = true; lblEndTime.left = 92; lblEndTime.top = topPosition - 20; lblEndTime.height = 14; lblEndTime.text = "Stop Time"; lblEndTime.foreColor = "#9ba5bd"; lblEndTime.visible = false; txtDuration = new Yahoo.Controls.TextBox(frmMain.theme); txtDuration.text = ""; txtDuration.left = 250; txtDuration.top = topPosition; txtDuration.width = 45; txtDuration.height = 23; txtDuration.enabled = false; txtDuration.visible = false; lblDuration = new Yahoo.Controls.Label(frmMain.theme); lblDuration.autoSize = true; lblDuration.left = 250; lblDuration.top = topPosition - 20; lblDuration.height = 14; lblDuration.text = "Duration"; lblDuration.foreColor = "#9ba5bd"; lblDuration.visible = false; topPosition += 50; txtNotes = new Yahoo.Controls.TextBox(frmMain.theme); txtNotes.text = ""; txtNotes.left = 8; txtNotes.top = topPosition; txtNotes.width = 288; txtNotes.height = 51; txtNotes.visible = false; lblNotes = new Yahoo.Controls.Label(frmMain.theme); lblNotes.autoSize = true; lblNotes.left = 8; lblNotes.top = topPosition - 20; lblNotes.height = 14; lblNotes.text = "Notes"; lblNotes.foreColor = "red"; lblNotes.visible = false; btnSave = new Yahoo.Controls.Button(frmMain.theme); btnSave.addEventHandler(btnSave_onClick, "Click"); btnSave.text = "SAVE"; btnSave.top = topPosition + 100; btnSave.left = 229; btnSave.width = 67; btnSave.height = 23; //btnSave.foreColor = "#00cc00"; btnSave.visible = false; /*btnClose = new Yahoo.Controls.Button(frmMain.theme); btnClose.addEventHandler(btnClose_onClick, "Click"); btnClose.text = "Close"; btnClose.width = 71; btnClose.height = 23;*/ // Add the logo to the top left. imageArray = new Array(); function AddImageToFrame(frame, src, hOffset, vOffset, width, height, opacity) { var image = new Image(); image.src = src; image.hOffset = hOffset; image.vOffset = vOffset; image.width = width; image.height = height; image.opacity = parseInt(opacity); frame.addSubview(image); image.visible = 1; return image; } imageArray[0] = AddImageToFrame(frmMain.window, "Theme/FreeTime/freetime.png", 16, 8, 98, 21, 255); // Add controls frmMain.addControl(lblPrompt1); frmMain.addControl(lblProjects); frmMain.addControl(lblEstimates); frmMain.addControl(lblActivities); frmMain.addControl(lblStartTime); frmMain.addControl(lblEndTime); frmMain.addControl(lblDuration); frmMain.addControl(lblNotes); frmMain.addControl(cboProjects); frmMain.addControl(cboEstimates); frmMain.addControl(cboActivities); frmMain.addControl(cboStartTimeHour); frmMain.addControl(cboStartTimeMinute); frmMain.addControl(cboEndTimeHour); frmMain.addControl(cboEndTimeMinute); frmMain.addControl(cboAMPM); frmMain.addControl(cboAMPM1); frmMain.addControl(btnProjects); //frmMain.addControl(btnEstimates); // frmMain.addControl(btnActivities); frmMain.addControl(btnStart); frmMain.addControl(btnStop); //frmMain.addControl(txtStartTime); // frmMain.addControl(txtEndTime); /*frmMain.addControl(btnDuration);*/ //frmMain.addControl(txtEndTime); frmMain.addControl(txtDuration); frmMain.addControl(txtNotes); //frmMain.addControl(btnClose); frmMain.addControl(btnSave); //doLayout(); frmMain.show(); everything_visibility('off'); showWidgetPreferences(); }i%niBg/* Copyright 2008 FreeTime Manager, Zoo2 Pty Ltd. */ var lib; var libraryPath; var libraryFile; var theme; var frmMain; var lblPrompt1; var lblPrompt2; var lblPrompt3; var lblPrompt4; var cboProjects; var cboActivities; var cboEstimates; var cboStartTime; var cboImageCombo; var pgbInstall; var chkCheckBox; var pgbInstall; var txtTextBox; var btnCancel; var myprojects; var currentActivityId; var currentProjectId; var currentEstimateId; var currentStartTimeId; var deployMode = 'development'; //var deployMode = 'production'; if(deployMode == 'development'){ deployDomain = 'http://192.168.0.2:8002/freetime_app/'; } if(deployMode == 'production'){ deployDomain = 'https://www.freetimemanager.com/app/'; } /** * Startup code for the widget. */ function widget_onLoad() { // Verify that our library is where we expect it to be. libraryPath = "Resources/Library"; libraryFile = libraryPath + "/Library.js"; include(libraryFile); lib = new Yahoo.Utility.Library(libraryPath); main(); } /** * Handles theme onThemeChanged event. */ function theme_onThemeChanged(sender, e) { log("theme_onThemeChanged"); // Set theme on main form frmMain.theme = sender; } /** * Handles onClosing event for form. */ function frmMain_onClosing(sender, e) { log("frmMain_onClosing"); } /** * Handles onClosed event for form. */ function frmMain_onClosed(sender, e) { log("frmMain_onClosed"); doClose(); } /** * Handles onResize event for form. */ function frmMain_onResize(sender, e) { log("frmMain_onResize"); doLayout(); } // Turns everything on or off function everything_visibility(toggle){ if(toggle == "on"){ if(cboProjects.selectedIndex > 0){ cboProjects.visible = true; btnProjects.visible = true; cboEstimates.visible = true; btnEstimates.visible = true; cboActivities.visible = true; btnActivities.visible = true; cboStartTime.visible = true; btnStart.visible = true; btnStop.visible = true; btnDuration.visible = true; btnSave.visible = true; // txtStartTime.visible = true; txtEndTime.visible = true; txtDuration.visible = true; txtNotes.visible = true; lblPrompt5.visible = true; frmMain.height = 450; } else { cboProjects.visible = true; btnProjects.visible = true; cboStartTime.visible = false; cboEstimates.visible = false; btnEstimates.visible = false; cboActivities.visible = false; btnActivities.visible = false; btnStart.visible = false; btnStop.visible = false; btnDuration.visible = false; btnSave.visible = false; txtStartTime.visible = false; txtEndTime.visible = false; txtDuration.visible = false; txtNotes.visible = false; lblPrompt5.visible = false; frmMain.height = 150; } } else { cboProjects.visible = false; btnProjects.visible = false; cboEstimates.visible = false; btnEstimates.visible = false; cboActivities.visible = false; btnActivities.visible = false; cboStartTime.visible = false; btnStart.visible = false; btnStop.visible = false; btnDuration.visible = false; btnSave.visible = false; txtStartTime.visible = false; txtEndTime.visible = false; txtDuration.visible = false; txtNotes.visible = false; lblPrompt5.visible = false; frmMain.height = 150; } } /** * Handles cboCombo_onSelectedIndexChanged event for a combobox. */ function cboProjects_onSelectedIndexChanged(sender, e) { log("cboProjects_onSelectedIndexChanged"); if(cboProjects.items.item(cboProjects.selectedIndex)['project_id'] == '0'){ cboProjects.selectedIndex++; } var currentProject = cboProjects.items.item(cboProjects.selectedIndex); var currentProjectLabel = currentProject[0]; currentProjectId = currentProject['project_id']; log(currentProjectId); everything_visibility('on'); GetActivities(); GetEstimates(); ShowStartTime(); } /** * Handles cboCombo_onSelectedIndexChanged event for a combobox. */ function cboActivities_onSelectedIndexChanged(sender, e) { log("cboActivities_onSelectedIndexChanged"); log("selected index: " + cboActivities.selectedIndex); if(cboActivities.items.item(cboActivities.selectedIndex)['activity_id'] == '0'){ cboActivities.selectedIndex++; } var currentActivity = cboActivities.items.item(cboActivities.selectedIndex); var currentActivityLabel = currentActivity[0]; currentActivityId = currentActivity['activity_id']; log(currentActivityId); } function cboEstimates_onSelectedIndexChanged(sender, e) { log("cboEstimates_onSelectedIndexChanged"); log("selected index: " + cboEstimates.selectedIndex); if(cboEstimates.items.item(cboEstimates.selectedIndex)['estimate_id'] == '0'){ cboEstimates.selectedIndex++; } var currentEstimate = cboEstimates.items.item(cboEstimates.selectedIndex); var currentEstimateLabel = currentEstimate[0]; currentEstimateId = currentEstimate['estimate_id']; log(currentEstimateId); } function cboStartTime_onSelectedIndexChanged(sender, e) { log("cboStartTime_onSelectedIndexChanged"); log("selected index: " + cboStartTime.selectedIndex); if(cboStartTime.items.item(cboStartTime.selectedIndex)['startTime_id'] == '0'){ cboStartTime.selectedIndex++; } var currentStartTime = cboStartTime.items.item(cboStartTime.selectedIndex); var currentStartTimeLabel = currentStartTime[0]; currentStartTimeId = currentStartTime['startTime_id']; log(currentStartTimeId); } /** * Handles onClick event for button. */ function btnClose_onClick(sender, e) { log("btnClose_onClick"); frmMain.dialogResult = Yahoo.Controls.DialogResult.Cancel; doClose(); } /** * Handles onClick event for button. */ function btnSave_onClick(sender, e) { log("btnSave_onClick"); frmMain.dialogResult = Yahoo.Controls.DialogResult.Submit; alert(estimate_id); // Grab all the values in the form var staff_id = escape(preferences.username.value); var project_id = currentProjectId; var activity_id = currentActivityId; var estimate_id = currentEstimateId; //var start_time = txtStartTime.text; var start_time = txtStartTime.text; var end_time = txtEndTime.text; var notes = txtNotes.text; function formatDate(date1) { return date1.getFullYear() + '-' + (date1.getMonth() < 9 ? '0' : '') + (date1.getMonth()+1) + '-' + (date1.getDate() < 10 ? '0' : '') + date1.getDate(); } // Calculate what the local timestamp is in UTC time. // We convert to UTC for storage purposes as we need a uniform standard time. // This is transparent to users, as they only ever view times in their local timezone. var currentTime = new Date(); var my_timezone_offset = currentTime.getTimezoneOffset(); var todayDate = formatDate(currentTime); log("" + staff_id + "," + project_id + "," + activity_id + "," + start_time + "," + end_time + "," + notes + "," + my_timezone_offset + "," + todayDate + "," + estimate_id + ""); var request = new XMLHttpRequest(); var url = deployDomain + "widget_v1_4.php"; var params = "action=save&user=" + staff_id + "&project_id=" + project_id + "&activity_id=" + activity_id + "&start_time=" + start_time + "&end_time=" + end_time + "¬es=" + escape(notes) + "&tzoffset=" + my_timezone_offset + "&date=" + todayDate + "&estimate_id=" + estimate_id; request.open("POST", url , true); //Send the proper header information along with the request request.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); request.setRequestHeader("Content-length", params.length); request.setRequestHeader("Connection", "close"); request.send(params); log("Saved"); // Reset all form elements to blank. cboProjects.selectedIndex = 0; cboActivities.selectedIndex = 0; cboEstimates.selectedIndex = 0; cboStartTime.selectedIndex = 0; txtStartTime.text = ""; txtEndTime.text = ""; txtDuration.text = ""; txtNotes.text = ""; frmMain.height = 150; } // Projects Refresh on click function btnProjects_onClick(sender, e){ log("btnProjects_onClick"); cboProjects.items.clear(); cboProjects_Refresh(); } function cboProjects_Refresh(){ cboProjects.items.clear(); // Connect to server to pull projects var request = new XMLHttpRequest(); request.open("GET", deployDomain + "widget_v1_4.php?action=projects_win&user="+escape(preferences.username.value), false); request.send(); try { var doc = request.responseXML; if(request.status == 200 && doc != null) { var titleNodes = doc.evaluate("select/option"); var myprojects = new Array(); for(var i = 0; i < titleNodes.length; i++) { print("Project " + (i+1) + ": " + titleNodes.item(i).firstChild.data); print("Values ", titleNodes.item(i).getAttribute('value')); myprojects[i] = new Array(); myprojects[i][0] = titleNodes.item(i).firstChild.data; myprojects[i]['project_id'] = titleNodes.item(i).getAttribute('value'); cboProjects.items.add(myprojects[i]); } } else { print("An error occurred. Response status: (" + request.status + ") " + request.statusText); } } catch(e) { print("An error occurred: " + e); } cboProjects.selectedIndex = 0; } /** * Handles onClick event for Start button. */ function btnStart_onClick(sender, e) { log("btnStart_onClick"); var TempName; var fieldname = txtStartTime; // Set all time fields to blank txtStartTime.text = ""; txtEndTime.text = ""; txtDuration.text = ""; var currentTime = new Date(); // Get Local Time for display purposes var hours = currentTime.getHours(); var minutes = currentTime.getMinutes(); if(minutes < 10){ minutes = "0" + minutes; } TempName = hours + ":" + minutes + " "; if(hours > 11){ fieldname.text = TempName + "PM"; } else { fieldname.text = TempName + "AM"; } btnDuration_onClick(sender, e); } /** * Handles onClick event for Stop button. */ function btnStop_onClick(sender, e) { log("btnStop_onClick"); var TempName; var fieldname = txtEndTime; var currentTime = new Date(); var hours = currentTime.getHours(); var minutes = currentTime.getMinutes(); if (minutes < 10){ minutes = "0" + minutes; } TempName = hours + ":" + minutes + " "; if(hours > 11){ fieldname.text = TempName + "PM"; } else { fieldname.text = TempName + "AM"; } btnDuration_onClick(sender, e); } /** * Handles onClick event for Duration button. */ function btnDuration_onClick(sender, e) { log("btnDuration_onClick"); var start = txtStartTime.text; var end = txtEndTime.text; var dur = txtDuration; // If we have no start or end time, then don't bother. if(start == "" || end == ""){ return false; } // Get hours and minutes by removing the : from the string, // splitting it into an array with [0] being hours, [1] being minutes. var start_array = start.split(":"); var end_array = end.split(":"); var start_hours = start_array[0]; // The substring removes the AM and PM from the end of the minutes string. var start_minutes = start_array[1].substring(0,2); var end_hours = end_array[0]; var end_minutes = end_array[1].substring(0,2); // If the start_minutes are less than the end_minutes, we can assume that we've skipped over at least one hour. // In which case we find the minutes duration by adding the end_minutes to the result of 60 minus the start_minutes. if(start_minutes > end_minutes){ var dur_mins = parseInt(end_minutes, 10) + parseInt((60 - start_minutes),10); var dur_hours = (parseInt(end_hours, 10) - parseInt(start_hours, 10)) - 1; if(dur_hours < 0) { alert("The start time cannot be later than the end time! Please correct."); return; } if(dur_mins < 10) { dur_mins = "0" + dur_mins; } var duration = "" + dur_hours + ":" + dur_mins + " hours"; } else { // If the start_minutes aren't greater than the end minutes, we find the minutes duration by subtracting the start_minutes // from the end_minutes var dur_mins = end_minutes - start_minutes; var dur_hours = (parseInt(end_hours, 10) - parseInt(start_hours, 10)); if(dur_hours < 0) { alert("The start time cannot be later than the end time! Please correct."); return; } if(dur_mins < 10) { dur_mins = "0" + dur_mins; } var duration = "" + dur_hours + ":" + dur_mins + " hours"; } dur.text = duration; } function GetActivities(){ cboActivities.items.clear(); // Connect to server to pull projects var request = new XMLHttpRequest(); request.open("GET", deployDomain + "widget_v1_4.php?action=tasks_win&user="+ escape(preferences.username.value), false); request.send(); try { var doc = request.responseXML; if(request.status == 200 && doc != null){ var ActivityNodes = doc.evaluate("select/option"); var myActivities = new Array(); for(var i = 0; i < ActivityNodes.length; i++) { print("Activity " + (i+1) + ": " + ActivityNodes.item(i).firstChild.data); //print("Activity ID ", ActivityNodes.item(i).getAttribute('value')); myActivities[i] = new Array(); myActivities[i][0] = ActivityNodes.item(i).firstChild.data; myActivities[i]['activity_id'] = ActivityNodes.item(i).getAttribute('value'); cboActivities.items.add(myActivities[i]); } } else { print("An error occurred. Response status: (" + request.status + ") " + request.statusText); } } catch(e) { print("An error occurred: " + e); } cboActivities.selectedIndex = 0; } function GetEstimates(){ //alert(deployDomain + "widget_v1_4.php?action=estimates&project_id="+ currentProjectId +"&user="+escape(preferences.username.value)); cboEstimates.items.clear(); // Connect to server to pull projects var request = new XMLHttpRequest(); request.open("GET", deployDomain + "widget_v1_4.php?action=estimates&project_id="+ currentProjectId +"&user="+escape(preferences.username.value), false); request.send(); try { var doc = request.responseXML; if(request.status == 200 && doc != null) { var titleNodes = doc.evaluate("select/option"); var myEstimates = new Array(); for(var i = 0; i < titleNodes.length; i++) { print("Estimates " + (i+1) + ": " + titleNodes.item(i).firstChild.data); print("Values ", titleNodes.item(i).getAttribute('value')); myEstimates[i] = new Array(); myEstimates[i][0] = titleNodes.item(i).firstChild.data; myEstimates[i]['estimate_id'] = titleNodes.item(i).getAttribute('value'); cboEstimates.items.add(myEstimates[i]); } } else { print("An error occurred. Response status: (" + request.status + ") " + request.statusText); if(doc == null) print("doc was null"); } } catch(e) { print("An error occurred: " + e); } cboEstimates.selectedIndex = 0; } function ShowStartTime(){ //alert(deployDomain + "widget_v1_4.php?action=estimates&project_id="+ currentProjectId +"&user="+escape(preferences.username.value)); cboStartTime.items.clear(); // Connect to server to pull projects var myStartTime = new Array(); for(var i = 1; i <= 12 ; i++) { print(i); cboStartTime.items.add(i); } cboStartTime.selectedIndex = 0; } /*---------------------------------------------------------------------*/ // Private code /*---------------------------------------------------------------------*/ /** * Closes the widget. */ function doClose() { closeWidget(); } /** * Does a layout of the controls on the form. */ function doLayout() { btnClose.left = frmMain.clientSize.width - btnClose.width - 8; btnClose.top = frmMain.clientSize.height - btnClose.height - 8; btnSave.left = 8; btnSave.top = frmMain.clientSize.height - btnSave.height - 8; } /** * Main startup code. */ function main() { log("main()"); var lang; // Includes lib.include("Yahoo.Resources.ResourceManager"); lib.include("Yahoo.Drawing.ContentAlignment"); lib.include("Yahoo.Drawing.Common"); lib.include("Yahoo.EventArgs"); lib.include("Yahoo.Controls.Theme"); lib.include("Yahoo.Controls.Control"); lib.include("Yahoo.Controls.SizableControlBase"); lib.include("Yahoo.Controls.Sizable3PartControlBase"); lib.include("Yahoo.Controls.CheckBoxBase"); lib.include("Yahoo.Controls.CheckBox"); lib.include("Yahoo.Controls.Label"); lib.include("Yahoo.Controls.Button"); lib.include("Yahoo.Controls.ComboBox"); lib.include("Yahoo.Controls.ImageComboBox"); lib.include("Yahoo.Controls.CheckedListBox"); lib.include("Yahoo.Controls.ProgressBar"); lib.include("Yahoo.Controls.TextBox"); lib.include("Yahoo.Controls.Form"); // Create a named theme theme = new Yahoo.Controls.Theme("\Theme"); theme.loadTheme(preferences.colorPref.value); // Optionally you could use the default theme by passing null to a control such as Form //theme = null; // Listen to theme changed events theme.addEventHandler(theme_onThemeChanged, "ThemeChanged"); // Create controls frmMain = new Yahoo.Controls.Form(theme); frmMain.width = 400; frmMain.height = 150; frmMain.left = (screen.availWidth / 2) - (frmMain.width / 2); frmMain.top = (screen.availHeight / 2) - (frmMain.height / 2); //frmMain.formBorderStyle = Yahoo.Controls.FormBorderStyle.Sizable; frmMain.minimumSize = new Yahoo.Drawing.Size(400,150); frmMain.maximumSize = new Yahoo.Drawing.Size(400,450); frmMain.addEventHandler(frmMain_onClosing, "Closing"); frmMain.addEventHandler(frmMain_onClosed, "Closed"); frmMain.addEventHandler(frmMain_onResize, "Resize"); frmMain.window.level = "topmost"; lblPrompt1 = new Yahoo.Controls.Label(frmMain.theme); lblPrompt1.autoSize = true; lblPrompt1.left = 14; lblPrompt1.top = 0; lblPrompt1.height = 14; lblPrompt1.text = "Please login with your username and password."; // Listen to changed preferences widget.onPreferencesChanged = function( event ) { theme.loadTheme(preferences.colorPref.value); if(preferences.username.value == "" || 0){ lblPrompt1.text = "Please login with your username and password."; everything_visibility('off'); showWidgetPreferences(); } else { // Okay, so they have entered a username, lets make sure it's correct. var request = new XMLHttpRequest(); var url = deployDomain + "widget_v1_4.php"; var params = "action=check_user&user=" + escape(preferences.username.value) + "&pass=" + escape(preferences.password.value) + ""; request.open("POST", url , true); //Send the proper header information along with the request request.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); request.setRequestHeader("Content-length", params.length); request.setRequestHeader("Connection", "close"); request.onreadystatechange = function() {//Call a function when the state changes. if(request.readyState == 4 && request.status == 200) { var myResponse = request.responseText; log(myResponse); // if(myResponse == "yes"){ if(1){ // lblPrompt1.text = "You are logged in as: " + preferences.username.value; everything_visibility('on'); cboProjects_Refresh(); } else { lblPrompt1.text = "Please login with your username and password."; everything_visibility('off'); showWidgetPreferences(); } } } request.send(params); } } // Project Button for refresh btnProjects = new Yahoo.Controls.Button(frmMain.theme); //btnProjects.addEventHandler(btnProjects_onClick, "Click"); btnProjects.text = "Project"; btnProjects.left = 300; btnProjects.top = 26; btnProjects.width = 71; btnProjects.height = 23; btnProjects.visible = false; // Estimates Button for refresh btnEstimates = new Yahoo.Controls.Button(frmMain.theme); //btnEstimates.addEventHandler(btnEstimates_onClick, "Click"); btnEstimates.text = "Estimate"; btnEstimates.left = 300; btnEstimates.top = 60; btnEstimates.width = 71; btnEstimates.height = 23; btnEstimates.visible = false; // Activity Button for refresh btnActivities = new Yahoo.Controls.Button(frmMain.theme); btnActivities.text = "Activity"; btnActivities.left = 300; btnActivities.top = 96; btnActivities.width = 71; btnActivities.height = 23; btnActivities.visible = false; // Start Button for start-time btnStart = new Yahoo.Controls.Button(frmMain.theme); btnStart.addEventHandler(btnStart_onClick, "Click"); btnStart.text = "Start"; btnStart.left = 300; btnStart.top = 146; btnStart.width = 71; btnStart.height = 23; btnStart.visible = false; // Stop Button for stop-time btnStop = new Yahoo.Controls.Button(frmMain.theme); btnStop.addEventHandler(btnStop_onClick, "Click"); btnStop.text = "Stop"; btnStop.left = 300; btnStop.top = 196; btnStop.width = 71; btnStop.height = 23; btnStop.visible = false; // Duration Button for duration-time btnDuration = new Yahoo.Controls.Button(frmMain.theme); btnDuration.addEventHandler(btnDuration_onClick, "Click"); btnDuration.text = "Duration"; btnDuration.left = 300; btnDuration.top = 246; btnDuration.width = 71; btnDuration.height = 23; btnDuration.visible = false; // Projects Select List cboProjects = new Yahoo.Controls.ComboBox(frmMain.theme); cboProjects.addEventHandler(cboProjects_onSelectedIndexChanged, "SelectedIndexChanged"); cboProjects.left = 8; cboProjects.top = 26; cboProjects.width = 280; cboProjects.height = 21; cboProjects.visible = false; cboProjects_Refresh(); // Estimates Select List cboEstimates = new Yahoo.Controls.ComboBox(frmMain.theme); cboEstimates.addEventHandler(cboEstimates_onSelectedIndexChanged, "SelectedIndexChanged"); cboEstimates.left = 8; cboEstimates.top = 60; cboEstimates.width = 280; cboEstimates.height = 21; cboEstimates.visible = false; //cboProjects_Refresh(); // Activities Select List cboActivities = new Yahoo.Controls.ComboBox(frmMain.theme); cboActivities.addEventHandler(cboActivities_onSelectedIndexChanged, "SelectedIndexChanged"); cboActivities.left = 8; cboActivities.top = 96; cboActivities.width = 280; cboActivities.height = 21; cboActivities.visible = false; cboStartTime = new Yahoo.Controls.ComboBox(frmMain.theme); cboStartTime.addEventHandler(cboStartTime_onSelectedIndexChanged, "SelectedIndexChanged"); cboStartTime.left = 8; cboStartTime.top = 146; cboStartTime.width = 120; cboStartTime.height = 21; cboStartTime.visible = false; lblPrompt5 = new Yahoo.Controls.Label(frmMain.theme); lblPrompt5.autoSize = true; lblPrompt5.left = 300; lblPrompt5.top = 286; lblPrompt5.height = 14; lblPrompt5.text = "Notes"; lblPrompt5.visible = false; txtStartTime = new Yahoo.Controls.TextBox(frmMain.theme); txtStartTime.text = ""; txtStartTime.left = 8; txtStartTime.top = 146; txtStartTime.width = 280; txtStartTime.height = 21; txtStartTime.visible = false; txtEndTime = new Yahoo.Controls.TextBox(frmMain.theme); txtEndTime.text = ""; txtEndTime.left = 8; txtEndTime.top = 196; txtEndTime.width = 280; txtEndTime.height = 21; txtEndTime.visible = false; txtDuration = new Yahoo.Controls.TextBox(frmMain.theme); txtDuration.text = ""; txtDuration.left = 8; txtDuration.top = 246; txtDuration.width = 280; txtDuration.height = 21; txtDuration.visible = false; txtNotes = new Yahoo.Controls.TextBox(frmMain.theme); txtNotes.text = ""; txtNotes.left = 8; txtNotes.top = 286; txtNotes.width = 280; txtNotes.height = 51; txtNotes.visible = false; btnSave = new Yahoo.Controls.Button(frmMain.theme); btnSave.addEventHandler(btnSave_onClick, "Click"); btnSave.text = "Save"; btnSave.width = 71; btnSave.height = 23; btnSave.visible = false; btnClose = new Yahoo.Controls.Button(frmMain.theme); btnClose.addEventHandler(btnClose_onClick, "Click"); btnClose.text = "Close"; btnClose.width = 71; btnClose.height = 23; // Add the logo to the top left. imageArray = new Array(); function AddImageToFrame(frame, src, hOffset, vOffset, width, height, opacity) { var image = new Image(); image.src = src; image.hOffset = hOffset; image.vOffset = vOffset; image.width = width; image.height = height; image.opacity = parseInt(opacity); frame.addSubview(image); image.visible = 1; return image; } imageArray[0] = AddImageToFrame(frmMain.window, "\Theme/FreeTime/freetime.png", 16, 8, 98, 21, 255); // Add controls frmMain.addControl(lblPrompt1); frmMain.addControl(lblPrompt5); frmMain.addControl(cboProjects); frmMain.addControl(cboEstimates); frmMain.addControl(cboActivities); frmMain.addControl(cboStartTime); frmMain.addControl(btnProjects); frmMain.addControl(btnEstimates); frmMain.addControl(btnActivities); frmMain.addControl(btnStart); frmMain.addControl(btnStop); frmMain.addControl(btnDuration); frmMain.addControl(txtStartTime); frmMain.addControl(txtEndTime); frmMain.addControl(txtDuration); frmMain.addControl(txtNotes); frmMain.addControl(btnClose); frmMain.addControl(btnSave); doLayout(); frmMain.show(); everything_visibility('off'); showWidgetPreferences(); }^D<PNG  IHDR tEXtSoftwareAdobe ImageReadyqe<XIDATxڬ+aPkQZW? GʍRN(ru[KlOc3iv89! +WPf,}fX!=p9 N0 D &qk5/X Q̸ƪv 1-^2Gz9Y z+Y6rH;vcPJ.:I=сU1B`q?P@C&%K"=řiDcA ,[nTSu7 lu@}) iǚlũ6ڢ1#-6_X SkOIENDB`N}j.}BPNG  IHDRCtEXtSoftwareAdobe ImageReadyqe<|IDATxwmU/:fU]sdm+CQ*(-(( (*j ڂ 159*JTڻ[c5q]}|Ei51o>N:k󳳳C\d=1}& 71}1͑_1"72E]\Hv9Q-?&{ENln9^6cjL˛}ֶkeڛzN{ 9t jG=<p8L?3AUa\K=}Ɣ#7,Gd[*ϟQW ;hTxE=T4[gn<7Wk(G"܌gZ#-Z#AtKpak3gb E ZT֍j4lZ=+V+W/苾V[/wO>W >.ڠ2f*lP](dpItG"\f\nxTR'P>l2w"AԤBk1`/s[cCk'{Slc#zY_a)Xc}Tp9֭_)[. μvJ>7RӶש`h?}\}>xKf.)啕YbeY|/s>^Y!h:LW^% W²aUz0Li\a%|Bu78obh\]_2IGƄ1\e덞j&}\lrHqk:*{th Jpߩ5W6>cxC֌חY}4:t( c5'M'1j57u>77VZcFh[{yS\;VLNLdS\&jZt"1 ƪݶ"Bه^4 9Nq^ؚV_}/'Z),,=a P/L94]cmIuݴT1+%c3>סE5o(_}(O]-`&'g &'52(lbe`z*"dL(Qu; J<2xG yp1g^(4X t$@CB3S?*m+kj*hײP .a޶eW ]KzJwEk㘙i/ 5ڲAhV\\om07QcrvV\&i- j*P$oci E2.wJ:;m6?EyM,Xfm5\lF|BA!}sKv(GPPIԬ1E|B@-+zF ?6rsS1_H纙?m$U O vzdJ##;99Toi"rWp8,Z̐$_33mLd@#="Yh,ehAPPF/H鐀?| f̅mhC->rR)|#bI4'`5cDCѪ4(1H80VT0+btH'fWU:W$`zӽ[gg&Hi(Kܗ +ffjjE)B#Fk;Zdp6Br b. F!pBONlL!34E"~9$e%L%t-ɿAX206,bVQ8il~؀tL) &4Іe%](,&beKk+Q>PK(aQ|7詵py&Y0)˜\hB`EgEÂRGA ㅢgV8F"1CyGZVe0\(1  .4.rO Q`jekq_b3>uwxA'8'īsMk42 &L| |)rD(Zv-y̘r-k(c~8wIL SP)U8%rHb~2C)\v*)*юPAXckhKxg{!~w{i.gs2VdUjm.rkB Dȋ%;*dB%hgjWiRbgP$*TRQd4JAAajD $Oa+*{,5z}5QRdӠu/F.,V4I%;q= ~׹JJNV3 KGksx=G#? :~>pW p@^$g`$/\%Uu5*̂c&w6XJV`jD鲵0OZNR; Lԇ7W BtɼrrZ捖Ѐ2MA#S ̽Y.%*kBV ߤB2Kr+z=p(}YZō¤au.Hʫ^c.鹵c 2 YH.,.0:[~%B D#pHK2`x.k%ɴu 3Ϣ/Os,`K))ESw.PgOf0e9@Y)l U} ?L:hL4ε X |>-*+]US^`pGPj%ZU3dME+wMD&1V֪ߊ>r3r)\ܶl7]&ף_I çE*VF3ŕ7\4rp ĕ NEĔts(+lZ E1H-`; J3vϯ-Re-ϫ~~7V?T\vˮK HgTLB4{^ 4q7JAAY͜#) F ;nnb֎ q Y O+m^E $2ރ͒Xe-Ke\ct0@mtXʧZ=(`-7nYûckT?6Zann>aŊCN%8#w_mllTB{0(\ĕ^z>ӿuN:mpJB /}8K^mr}Wy\ 뭳6kۥװ ^ _ӫ_ŋpùE?m_ .BmB/yu XI-R P$T8IqG"T҄5 qPnyI'̪RP8_Ԁx0OE|iZD\ʣk]; U],L] fU̡ 9吞rp(}˞o="Wl|ɧ} ~QJiYjLx?λ1(:;Y3[޼ nŽopM6\p$$ ¿w}K0L6]vyj|ozR +\p1M 0?>SWE]1QSYZT p.b˙ LwfܧB<>Y׉^I xJEz4PBݳ &ʝf2s< Zތ(\PJn ޥ׀{Az >U<#@~wzxɵb Hx>`dPfRa1Bz o~{Xϫ,K<-g).ê+cتW$I:$4d$M4Q֌ER&C xy y.FJ=#9dGuxYܷU)J Qʽ/JGL1D:,64$=;Wt3,My%и$:2sA< O/Iۿg}?Wsߪ~Z]hPC8![o>~8HB+.?pcaue*/ :foڴ^Eƴ&A;]YoE.=_jE?d @7@Sxfre/"2HFɳ+@h@^y'TV`yㄏ~ȽBǝrZgQ:dCHz<6M?`V U5vq |POX/k0o+Y/?ʞC"fd`*`u͈ ((;k-4mb.pDEKpEޖc ";R!5 *G̳UUHȌrwHƪ=EG F" LEHWXFyTPHhW>~ufUV[O-[+F% @^{ѭȸ8\J'z>i m' %(J +IEޢV% r* :r";0,H:l킕ڡp`eDfH! m(fc,bYPq0PdQFv}$Z'%d(}q-y`xyt LͥZ GFv\X#m,ycp:<ÁQ0.nH,th ;-cp"i t G.A7Yma+[ y93ƗL֓ Wy4)Jr  b=]\"?TFt9%M}mp lp kw@~n,sE"˺煫eهvAa.5!Q)㋆eick JUMQO0SKkz$E\f}# v]MZ06Zt/y\3{֡e>Bwym Uoᛑ_c>Z1w7 E'Bd{(U)KVzFK.n[p XTy$tGШTBLuDͅF[xIWlR a?-P$q<{OTr'9U1CjTz$M}Zk=} Ȥ4e\`"⨕8OJb! j&a Gٌg-rA2C~)\'!:ƠiL'9 ԌLo6͛K1wQ" Ol%p1G$|P#3湘%DaQ4 -`pDU bk ;pA$&arQG_*WIqf2 Q*,)!rс*FQf|r?Zy.@ISpE*9 1:职L4OT6cPj1A̷ucZ0$ v1ZBRv|IB$k5+sO1]~Ea6Ypt%\S-?سBFGPK#% +$DWUdlh&2ٖŁ,7XGfy}LUxJCMH4?ϼztHεɣM]U=Efܟ3'@hl~i|aajǏDSZȢ/yv*DAY9w$GcN|1-qNʙA<+-9-:l&\Hʣ-I{`!%Z^Rf _zU "bG*U &,ᘰ3 F^{` ~+"SBK*Cfh_+Af˪]OK!YkXX">Fm+V,]]V C%,\Z9+nQ^\L;O3Q0{ARIL''eǏ_6'mʏ75вws,ƭSzF*D;`YD.RVY_G * E[KFU4Z b4e -.MS!dj@2[5qp"i9SV5luWorq2@\-Xs ND˚q\m/FCfnaV܌dV^Xw}yN ;@+@U!N^-wP,nEY[TZljj* 啀YbՈy&#l@{ɼr3kAVz|bzQorf[E (8np;2 ߫fvY(>҈FK(T[!ױ3 8f` P3(^gt#O[5]76(!y*fs U^yxĚb;~O[Mr֎UB22BPHVY= +˕R9i*wrf eڀV1-؂6r;REidtil>o rQ9H{ ~#2R܎6@2؀WO*E# *Zt3dkV+,^h7zEڒfޞ$Aqٸ\Igͱt=R7U.Q?h1 \: 7P׳ qYj;AFηxthUU_M`t}K8d{6 C. q5̦N}乼FdQ|𼡠 :&£zUgd40ІrY>'!Z`R QX1$z,i *Tܶ sL?'},YWь[`|96V4LwFb8ۚ腞)(iP6i ;(x?P!vx^hdQt}}v߭l!E%mj~TAЮ³ ~pYlEV\è]ь}j;?i|i^zydB0n"lW˧v]e\<Io1I~nx1n3zRPK4MRI]6 ֫ʅ>3;Na"N2 h5t\.j i#0 ?-A7 <0 Ss4`l2@ҥZ:s60}\gi ?w꿟5j"04fEla9|7p4?֞b {sr*$5 s%.9=Q8ֹ5Z"rTq>ߑU[2eϡ(VՂ%X.TP.r&`Z OLʅ;x{N?sT]]m{U/Oy[xo@\>s\s-SOJެ:^ ǝF‘'|TطF!Wzk G'|K篽H%c귾ҵo Ȱ-{;߲wzeWExJss{q'B8PQ}XB:d%a_nKgrPe29*Kdžsr)_qy/H}iDO_g4?Ei.~vbTq{8{"ٸuZe  GU_kix3`y<4'IczS>|S~%VܳypwޝL /<}u2sF+/}=8O<<ӪJvTSh,+=P.ڌf.RAUa<|nJdFȑ: Y7jb&/?pw tPxąI{UEs Cgp~ lV/Jzo.;޲WZdW|Z읪H1nц23ަ7M 7;?xd:inv>]˱bdטj4gܾc߽k:7m}rh7|u+ᙯ?wx  AH)h`Vi.HO}>, Axgo/OϿ~x.t.&?x4vTxhݣ}9_>9#:v@Ew]5gM{oMƱy*L7LM| <>PckkZfes|3-gܖuͷ6ud o M?goY@K0R[ q-MO52"WM~F}q^w˭߿5|ʤ590МF+h|T˖/?T5qx(8p升1g'x7pZH% ?dJҺ ~ |W7W \HM%$d$u}C0B#x ZO<ZwM6Lk@|,.Mo'8z*+9| 1t}Cv9ĖWV~{Q0 i,75LU~>Q|.p}Q)7&PHjWV-X=MF/4 +Wr8@lE뮣?0-nl %[xl5$c\=|/˖TItt6h4|x6 2>K4@sZY$hzBlW*l|\^܍lѱnR~䃄Ͽ<|*% kvA z֕F0+疯\ɟ'L>ky]UcV޻,beKMnQg0k< ty ɅPf- <ݱfff<Xlch!TM%[7+9rY`@-3="m.8QՇ/{[tc7t,*E@өf"7Fz,^Ą}:ʤ= ĺ~u }jN0)`/e=ASJ̐ u8h;VMA5~p痌G{3N"pBSF*jȰo4waN/~Q W0J5n@>`hޣAZ??pqKf5k ] >x p0tĹxCΜg䮡CsۡClf- 'ev/N>A<ພ[c'P 2jpY|O,U/'y ^~XĈhC9 EbQFF7Qa.*6?7;VVKY699n[$02l11jD!1B7^p۰coP ?ӢTy֊燢]*j8Ѝ͆Vਆ p*pad `lR#z.L8p.\X/Ieg|?ytl,KrДvD7W-<ʚ7=BA$^ɡԲdvio|NHcc00 yيIƈQm*cX lPQ$W3Xgr2bRY0cOhh^W=iqNXd*Ƥ?XVQn(^Udіw|[=8!KLj#2htXɡ:$] %$x?iG+YM*8ps&:(g&хvMl9Y0֪֚j`X(>Ѵf٧1ںݵxˠDp #خ!=xb8MQdx J#cj[X9e^_J^FۥZVR( ho#X]k%^6RE.ib5VʖP7l 4e={Sq- Yf^uE #Bh:߄ʣIMkwo ,)\d'G,TY=[J)`3`ܰO64n!_Ni-J=@pG(VI rD0!8AyZPEc{=%'$MM Ł^a՚۹֔NXXSB]R@l%aZ $* {?h:f0,Z H$Ӡi9[*ޤ|øfA'y(;ୣb6vc)`I ׌1~" 4?)@L$<>۫,mVTfnfdV^ϟ X MKIi ن)P@YXdxv% 0%bi 7*YoQSҦmmgԳnrfTF`n 6EKW ) _Կdo 5oQB4?eeMrKƚN&tV'M MIS [Nڢ "Ȅ¤A5Y_8V|dVkF8˴$_O,[^:^:pA-=(|$Ά =t53 vSԏZidUpH6rSEMCW0In=]V뱇X. ma)c#Oh! "f: >j\5f D\ 4Sdb4Gނ,Is7N wAs((2B6rCLj~_9ZkB5yPQ54r̼iW%tw#՚;P/VvtUjGot)`CS:LLM8i-0=kB&0C4"zl_3i#eKsoB̲uQ&)A#:"R${g7],ihcY<~7 [3.&Dmp]vuA^\ԶyciC(E|" s @KR/U 7|Ha#=7sB*hk9S%t3$_KadN*@zSS兄Re<ܢ;ji^Λ|e=ܩLSI2Mm#Qy{B%3"Qq9PdʀD!P `"e˘X2U˅ޢcHffƂ;Xhwߓ<8GZV bM0Ҩˉ+i*=*@ܓ-+nXҔq5^n%'njK;A=bZ%j8iHg?cuVm1~R~`YojcM B)o-rX˼LAf+kykR˪+C23[x x? ˑ-%͍cJڪ1{Le&!fcc?C>v|r0$)X{b߁T6F{Wiaa9?x2G+ -/9jЬR%=56J"enn6;t JEuZb2$"ԄX?cYlE]!rW7<߉ ȗhPUH\l6}mڬCI()b7UP8tTyilqK=7;[YyǠk }Yml|.ʀHj)g .AKg8 䘋t+" {ˢ@e9GLj#(MAi͍"Ў3")j!u/i9SS2J2Z$x++V@4ݍdީpn>f+2.&ŧd 0 f3VaY)GHQ@ . 61| uENhfpFN[Sd DgH)1MZ:%CMmQ5fZ3QilXotDV}Ñ4viN.qkVvP%`S%x9i6cb2vQZ*fY'50ռ{XEu +U_5 m|XTAިe@b { YxZ1`ZR7(;""pN@C<"$P#H`R22>TfPhي"/:iU/'AŸ0 &<1Vߝ)Z{c\[n&EGT)=$:f:DM0 MiO&  0IQ.LpUMq|8ػcDdk Bf'΂Qi^^ժuS0If)V۱ W  PQXf4¯ N9NtG%e)*`9˾;BSX|HY#ԫPdƨA.I~ѶPZ $5/(zWTцs!yHg&?z`̓ܭ-i2e8{X6c@\Aλg%s&Y  J7~PYU4ݟF`žєo,‘?ŭ%T`[[É )`teRi0& ^J 2"9P!76D`@zh)Ŀl*g)Ks[ Iԓ4F<`\a ɵ)HQj>pxX;њ%Vh_ah,? SDZ""$h(fVHtڄ8kE ! X=g뜄"#f>-j>!m^w;q68?X7ˈ%@-g\…Rfi#2o@\'+kYyG]5kL͡|ښ BiV$M.ǴYF@A FM ld70('\Z Nj\~bCe2`W_`yca0)iHfEQ 7e "$ML7GLV$(qX gP!hW\3$ 5%VLHZ'QUG|L! FTlYE&݇0 `%Z2SLMZd_! n/9ؙc-|v`<WLO|!7|_vhW ai槣{}'ի8{Xfn23ܟz"v# 2iA&$XN@cu YHԊ*ItuB *jor,(vEDijt˒P1RF9[zoUi ߫JfK`bSSvN 8,_4W XpLFK&A X鶕hqAPoh&& "I"OHcVbHG M,X&XsЦ5dz=MbZphنirP8@Zdz ۴:#]YҩQx[ZV>m3@5 .m\c @E4j!s!Skty8MGYokgd#MS9d~ƹ P~h]V4(AvKW4ba}`آaXUR!CkWg`?^[#E2oBu{#ojH^ FUNš74' E)'pv,I%OGPEJ 0Θ1>w:03`#IV40뜣$IΣtQ`AQD!F־YV>KqQu,F ;bYc~ՍWQe3KLhAf4X4Xf8tB tSHn*4@mY}Ru6 EPi:ڭǪg{)  ҥ )+ T`8!(2`lk=2hyrz҆o`%e7̲. 'áV@+_o`@RѾY ՗GE|@ [/l%9~-JOVU/- ; d"n--h,Ytl(p}h=@%ca"R-e5xN)X;Q.\SE֬7k!}i8_ ɿIǯE 6IGx&LDqO-+8AkFc93pf [hĂ)^_m^ o[TCo@_SL-C~RKSB{[VRe([DB-yI~7fb83ԸhN~ϤNP ;ɀ㢊PqcY0+\nYt3l@iM+AFt^²,k hP`AiiSeI 2dmO)P. K_}@le^b4 ɡ>։G̀1P%4Za`L6 .AQU}/"^t4h* T ֌_4N˴0-r 5W/-g8P^D0> Q-dҺ󻥵 Q#4eq; 1꠼)ɷn-HZSf  4T#ҵOENk@$: Dć  jr@AY0? ZWb ,JyBJ{w0y^T\x)A`!pa/jYx@0U_P u_{jNVvxc1(e(Ŭ h^ MOmp1"F3EIEE#*ܒbSsgeX:!ih;k)y (zTқBTrS m$s\˞ǃT`Z\ `9 ӐZDZHc׊{Z, 'ŵX( e֠rxjQ2s'ȪިvJM9S|( 43Jdk2e}CN ȘVTԏ%CB@[Nv֤q)jPw$'IhiVU`ӧo&(W02E^0zuHo&1@O4%>Kf¬}X>Nj-1υf;Ϸ((a7R*#42Zo;;aJ2ZZ(hltY%` &'@֒GBJUEBϚLGv^Xy sZq 0|IA@':Tʐ^ǃ!Hq6)Cwj[U#10&- PWb F#@a)Ю2*-t+9(Y lѠ\q/ppBeۑ=l+@IKM?57h⁧[$7l"^nlI)A#~lDs+"Vv7,@UZ)St2J BMq=%s@(,?-b Dh|A_I";^fڶ*AvO4_;B(!BE -r*yP2>,ԁ/nt"1@6\pJ8`zkqž6Aw$Aee"ƍxU eJv|YfBCOh#L@pi42] kJ 2eXQP-bWL1C=SXLҪ3;FQ̅>Aae4ZI81QeeaGi[Ьy*0;0*#Wt4'"R- P_YYނIb)m`'^-ޜG]rI.Ti_nUs c֞cд呑aqq@X 4[̃p5PPaV[{Q/XVM)#q3Ƃ͉6>F4E)} H<q+:tʇ D2G*"# 疀$mDq+1|&Yـ8yl C&=\xT')"<.,Cց9xQi㏐hC] }K%!"F[Fz[3܌hƑ w=8Yu39y "GA .Gtq03";n O %GH&YQ6܀( Dm_ Ec#HYDuq#KP'-/ϛ{58-TrP|${nBF[ƽ1z7ּ7nGCw V7}HRs_s 񳣁5H~8g%IV*/DAD5@Һ4׳Kɪmvfcrx;k,Iڔti r$H%/~+2"g'NXl"l;ϩ)` I|2э  VeZZ H)U!,c*1ofMogdQAm-IIO=0m]ncS"ROs} f "wv;Ѳ{E BѬO}[QHm ;@lV )'BV6i8nhJkG:A46hb gS0)bl(6IEKVȕD`e\z?_eh8ٹUYE̒"Ԗfjt{,ThqEυ\QE5Z+,qy5opBa#L-Q*rO\oJW=>&eU%<r-aCFt P $O#S\_[:Q+S T i\ `}%IX]+mtDT+[Dc/-;D|,+q+{rv@P`= Ў#TIϢˆ2 $v/=({B̔4 4Nl{84]vo42Z(!$2GPDڲR!g)|׍Mlx>eQXf:%;מmCs]12KCp-Ool3t  B(ji#4shD Ŭ5MSzWs"z fZl׼|Q8G1Ԇ=3tV=^-`-cG"_2I"҈[#f."W!n`ǁmqK[558y0Sҗ]=0F\JҏeV"EMi(ZI-]zӿl-Jը62CYs92IMZβ>!;J8%a ]LɄΖަs^呏MZ㤖A}dȲ0PRr=ewǂ45A<-δFѫYژNGނp~+Vҙg{޾ozӾWZxɋz#l|JWq6iwx+^뮽Ve=g}pϮL4Gr . -{~Ws`= ]iJ}+g$g5y?U}?հo\]_Rq ]sؿq>#}w[joWlDŽIUj K/^#Y|oƈ_d^n/]nvr5Ows_ِ8Usǀ\X7oVa3{9\?8A>ˮxpL7UV S:4gtèQ#'렺A|6l1VqEkZBC84v8-Y4g{><[$Lv~ lКkgKlac^n3? nqu+䛕5 ^ 'sD_毮-1; |ca׿n*/\,.i8cVƧe.^DMYY_B,hhl56M,yxø.R/&C 44ϻPi/66)n@63ntBIn Ҍ@g6oO4 'h)B5j4]= c>Htsyue.nyGe?!qAi(Hd"uՕ߃@Dž@WW^aC2Ș=`j`Z׊߃AeBwSF(\hZn7A]0K#ͱ2hĀy- ydeQZkC`P=ɥkK-_??[g2`X_*x[QYMn  '&G.+ߋ Zsmt;{.Y9pg@0/ mwaiKa8̖@N!`UX!`%\(EIiJ[U!s&6.ĂQ7aɨR-tH9th!C'{p} AX8[W-ö*m$\Pk>z>es0d^(\8GTs~zwZ+w{^_#熅h3l쇾äü4Ir G9XYa[c`eMD_btݬ!4.^čqK!Xn|JkÃDj6so|FmGɲZ*S7/^h90dSYw_ ??5#0ݑv'Z-[ -Ùɧ{H *Dd7.VL>wp\~i),]F¤{RŵEЙZ v9Z %n%y/:]-nyͮd%5hTdIYF"MiMBCJ ;ЌiV0 qK3$͜-qTI_6[m_: v۰cqBpRgu}\۲~clG6|i0N7:F[Jst9_ޜ={~'kxvWJ/~Xʂ(UIj-`xi.5"1Yj1f5LRZJh n2: ZaYPY;(=o{= AEq1v-ܜǜS5TGS7x~pחk^~N|,^rDsLi]w"50FlPaHz JPY}ϕٽ\f &+%k9{7$|v;9Jk$CYz<; 9mwà<./f?h$ulS'=8 <ׅSVea3j6e/L"(&6^OP,CMNNիmD:3t FsCVh./6(pP/ 1=zGS"\`d&b lj{﹏i+ pm _oK>8W}'&XQ>>8.̷3Fnp|T<1ˉZzE{k?= ̈=LǼi^ ߵv?=0sXhHS"ӖT v syŪ 0ɑM6|Ve5sӝtAB|Ғ <.+_HaJ-أrrjl\;[/\ vs0ss CkNֆH?6595 z3Xd@˾Eaؗ`[2$\6thn|1lH%5vTټVmRZKV獢V`>~˔e 7_S$<"1hU.ؓ^4m \ؠ>&"d%th;LFA'@](6N$ *I1X=P/m,KyեQ]r('}6l&'a3KG{ qD>9fi J 24O- .lv1ZGz@7 Ƣ~P(Bj,^Su`R8k.Kde\y^jm-ku6#I|f_:ϙoF"KjX$$ :q9tQ_)tYj`Ȕ&gVhP՛43N) S7776EmZK.\niE,>TZ$1LflTdF#*'BF$&@f"\4?M"՞ZX3 ,rqmK JwyZ.O0M`~t^$Azu@յ0\3J e9`&Q~q}? =U,n .s%<_zGrfg+_k6}(z`H-H ZA\s@As8gJN \@ FDA\2ilAڂU{!*bL7D.JH1ף`2 JZc+IJdRS\J &?k#۽m)Qf8}DSuMޮ"b5BK1< a\=Wjz=/Od=gnنM*itsyLe} ү[Lbݬ w0r2f{̤3).X*Eى@foH5KVSB&A1@Cc;)ɘ"Pxd'IV[R1H;jfݖJce[f6\6magPz4+#pS)'w՗mwqJ)IoMFp,L r*Wi"4]#1}Dњހ8yy4~A 5Þ 1%簻d4^$ < ݚ4>r]͖qYI,)1 +B#j7eq%4 = EbsByߕ1r>ujcE( p|Lis\bz>29O,"ơ[4nQ.Vs3wrkA?:j4KfIP5l/Z5Iip2K5X),f3̖'o8koT۰tzS *,!d(IkŬ,2 C#4ΟY-k$'Xs~4PkYkQ ^Qa/cE@3DZf(UCt#(!fju7609v֮XYW"11Pm yWzYS*yo\M +, ZOTN@U`,_|?kYY[,2$:s(lz-gMt6y/Yn319j.J=55騟vsf!Р"NUrn8 F^F7:،,vE䁷1tdIi{4IwvM;a D܈t+BAmkvjt!wf8,7zh43صl//˿lk{cOo5,OYPYOa \ Mz1%HƗJf-YJfŽ$.4a]r jz4+_"R].J`B0@)i*K]m jn`R (d*O҇.d)X"* 4nׅFK&Qi%Uuzd2N1DɅr!$#|K`k)B !B`9kIENDB`sD/*---------------------------------------------------------------------*/ /// /// (C) Copyright 2005-2007 Yahoo! Inc. All Rights Reserved. /// /** * Version independent wrapper file for newest/real library class. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Includes /*---------------------------------------------------------------------*/ __LIBRARY_VERSION__ = 1.01; include("Resources/Library/Yahoo/Utility/Library.v1.01.js"); n/*---------------------------------------------------------------------*/ /// /// (C) Copyright 2005-2007 Yahoo! Inc. All Rights Reserved. /// /** * Version independent wrapper file for newest/real library class. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Includes /*---------------------------------------------------------------------*/ include(system.userWidgetsFolder + "/Library/Yahoo/Utility/LibraryShared.v1.01.js"); /*---------------------------------------------------------------------*/ /// /// (C) Copyright 2005-2006 Yahoo! Inc. All Rights Reserved. /// /** * The exception that is thrown when a null reference is passed as a required argument. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Namespace /*---------------------------------------------------------------------*/ // Create namespace Yahoo if it doesn't already exist if(Yahoo==undefined) { var Yahoo = new Object() } /*---------------------------------------------------------------------*/ // Constructor /*---------------------------------------------------------------------*/ /** * Default constructor. * @constructor * @param {String} paramName The name of the parameter. * @param {String} message The error text for this exception. */ Yahoo.ArgumentNullException = function(paramName, message) { this.initialize(paramName, message); } /** * Define inheritance chain. */ Yahoo.ArgumentNullException.prototype = new Error(); Yahoo.ArgumentNullException.prototype.constructor = Yahoo.ArgumentNullException; Yahoo.ArgumentNullException.prototype.baseclass = Error.prototype; /*---------------------------------------------------------------------*/ // Public code /*---------------------------------------------------------------------*/ /** * True constructor. Must be called if this class is overridden. * @param {String} paramName The name of the parameter. * @param {String} message The error text for this exception. */ Yahoo.ArgumentNullException.prototype.initialize = function(paramName, message) { this.paramName = paramName; if(message!=null && message!="") { this.message = message; } else { this.message = paramName; } this.name = "ArgumentNullException"; }/*---------------------------------------------------------------------*/ /// /// (C) Copyright 2005-2006 Yahoo! Inc. All Rights Reserved. /// /** * The exception that is thrown when an argument is outside the valid range for the method. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Namespace /*---------------------------------------------------------------------*/ // Create namespace Yahoo if it doesn't already exist if(Yahoo==undefined) { var Yahoo = new Object() } /*---------------------------------------------------------------------*/ // Constructor /*---------------------------------------------------------------------*/ /** * Default constructor. * @constructor * @param {String} paramName The name of the parameter. * @param {String} message The error text for this exception. */ Yahoo.ArgumentOutOfRangeException = function(paramName, message) { this.initialize(paramName, message); } /** * Define inheritance chain. */ Yahoo.ArgumentOutOfRangeException.prototype = new Error(); Yahoo.ArgumentOutOfRangeException.prototype.constructor = Yahoo.ArgumentOutOfRangeException ; Yahoo.ArgumentOutOfRangeException.prototype.baseclass = Error.prototype; /*---------------------------------------------------------------------*/ // Public code /*---------------------------------------------------------------------*/ /** * True constructor. Must be called if this class is overridden. * @param {String} paramName The name of the parameter. * @param {String} message The error text for this exception. */ Yahoo.ArgumentOutOfRangeException.prototype.initialize = function(paramName, message) { this.paramName = paramName; if(message!=null && message!="") { this.message = message; } else { this.message = paramName; } this.name = "ArgumentOutOfRangeException "; } >4;4A /*---------------------------------------------------------------------*/ /// /// (C) Copyright 2005-2007 Yahoo! Inc. All Rights Reserved. /// /** * Button control. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Constructor /*---------------------------------------------------------------------*/ /** * Default constructor. * @constructor * @param {Yahoo.Controls.Theme} theme The theme this control should use or null to create an instance of the default theme. */ Yahoo.Controls.Button = function(theme) { //log("Button.ctor()"); if(arguments.length>0) { this.initialize(theme); } } /** * Define inheritance chain. */ Yahoo.Controls.Button.prototype = new Yahoo.Controls.Sizable3PartControlBase(); Yahoo.Controls.Button.prototype.constructor = Yahoo.Controls.Button; Yahoo.Controls.Button.prototype.baseclassButton = Yahoo.Controls.Sizable3PartControlBase.prototype; /*-----------------------------------------------------------*/ // Control code /*-----------------------------------------------------------*/ /** * Raises the onEnabledChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Button.prototype._onEnabledChanged = function(sender, e) { //log("Button._onEnabledChanged"); // Call baseclass this.baseclassButton._onEnabledChanged.call(this, sender, e); this._lblText.enabled = this.enabled; this._button_setButtonState(); } /** * Raises the onFontChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Button.prototype._onFontChanged = function(sender, e) { //log("Button._onFontChanged"); // Call baseclass this.baseclassButton._onFontChanged.call(this, sender, e); this._lblText.font = this.font; } /** * Raises the onForeColorChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Button.prototype._onForeColorChanged = function(sender, e) { //log("Button._onForeColorChanged"); // Call baseclass this.baseclassButton._onForeColorChanged.call(this, sender, e); this._lblText.foreColor = this.foreColor; } /** * Raises the onResize event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Button.prototype._onResize = function(sender, e) { //log("Button._onResize"); // Call baseclass this.baseclassButton._onResize.call(this, sender, e); // Resize text this._button_setTextLocation(); } /** * Raises the onTextChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Button.prototype._onTextChanged = function(sender, e) { //log("Button._onTextChanged"); // Call baseclass this.baseclassButton._onTextChanged.call(this, sender, e); // Resize text this._lblText.text = this.text; } /** * Raises the onToolTipChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Button.prototype._onToolTipChanged = function(sender, e) { //log("Button._onToolTipChanged"); // Call baseclass this.baseclassButton._onToolTipChanged.call(this, sender, e); // Set tooltip this._lblText.toolTip = this.toolTip; } /** * Handles onEnter event for whole control. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Button.prototype._onEnter = function(sender, e) { //log("Button._onEnter"); // Cancel enter event if we entered from / left one of our subcontrols if((this._isMouseOver == false) || this.displayRectangle.contains(system.event.x + this.left, system.event.y + this.top) == false) { // Call baseclass this.baseclassButton._onEnter.call(this, sender, e); this._button_setButtonState(); } } /** * Handles onLeave event for whole control. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Button.prototype._onLeave = function(sender, e) { //log("Button._onLeave"); // Cancel leave event if we entered one of our subcontrols if(this.displayRectangle.contains(system.event.x + this.left, system.event.y + this.top) == false) { // Call baseclass this.baseclassButton._onLeave.call(this, sender, e); this._button_setButtonState(); } } /** * Handles onMouseDown event for whole control. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Button.prototype._button_onMouseDown = function(sender, e) { //log("Button._button_onMouseDown"); sender._button_setButtonState(); } /** * Handles onMouseUp event for whole control. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Button.prototype._button_onMouseUp = function(sender, e) { //log("Button._button_onMouseUp"); sender._button_setButtonState(); } /** * Handles onMouseEnter event for label. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Button.prototype._button_lblText_onEnter = function(sender, e) { //log("Button._button_lblText_onEnter"); sender.parent._onEnter.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } /** * Handles the onThemeChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Button.prototype._onThemeChanged = function(sender, e) { //log("Button._onThemeChanged"); // Call base class this.baseclassButton._onThemeChanged.call(this, sender, e); this._button_loadTheme(); } /** * Handles onMouseExit event for label. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Button.prototype._button_lblText_onLeave = function(sender, e) { //log("Button._button_lblText_onLeave"); // Don't forward this if we are still within the parent control if(sender.parent.displayRectangle.contains(system.event.x + sender.left + sender.parent.left, system.event.y + sender.top + sender.parent.top) == false) { sender.parent._onLeave.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } } /** * Handles onMouseDown event for label. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Button.prototype._button_lblText_onMouseDown = function(sender, e) { //log("Button._button_lblText_onMouseDown"); sender.parent._onMouseDown.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } /** * Handles onMouseUp event for label. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Button.prototype._button_lblText_onMouseUp = function(sender, e) { //log("Button._button_lblText_onMouseUp"); sender.parent._onMouseUp.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } /*---------------------------------------------------------------------*/ // Private code /*---------------------------------------------------------------------*/ /** * Disposes native Widget Engine objects. * @private */ Yahoo.Controls.Button.prototype._button_disposeNativeObjects = function() { //log("ComboBox._comboBox_disposeNativeObjects"); // This isn't a native object, but we still dispose it here, baseclass takes care of its own if(this._lblText!=null) { this._lblText.dispose(); this._lblText = null; } } /** * Loads control elements based on current theme. * @private */ Yahoo.Controls.Button.prototype._button_loadTheme = function() { // Initialize variables/controls this._lblText = new Yahoo.Controls.Label(this._theme); this._lblText.fromTextObject(this._theme.getItem("buttonLabel")); this._lblText.textAlign = Yahoo.Drawing.ContentAlignment.MiddleCenter; this._lblText.addEventHandler(this._button_lblText_onEnter, "Enter"); this._lblText.addEventHandler(this._button_lblText_onLeave, "Leave"); this._lblText.addEventHandler(this._button_lblText_onMouseDown, "MouseDown"); this._lblText.addEventHandler(this._button_lblText_onMouseUp, "MouseUp"); this.addControl(this._lblText); // Get options for button from theme this._textMargins = this._theme.getParameter("buttonTextMargins"); this._paramDisabled = this._theme.getParameter("buttonDisabled"); this._paramDown = this._theme.getParameter("buttonDown"); this._paramNormal = this._theme.getParameter("buttonNormal"); this._paramOver = this._theme.getParameter("buttonOver"); this._button_setTextLocation(); this._button_setButtonStyle(this._paramNormal); } /** * Sets the location and size for the text label. * @private */ Yahoo.Controls.Button.prototype._button_setTextLocation = function() { if(this._lblText!=null) { this._lblText.left = parseInt(this._textMargins.left); this._lblText.top = parseInt(this._textMargins.top); this._lblText.width = this.width - (parseInt(this._textMargins.left) + parseInt(this._textMargins.right)); this._lblText.height = this.height - (parseInt(this._textMargins.top) + parseInt(this._textMargins.bottom)); } } /** * Sets the button state. * @private */ Yahoo.Controls.Button.prototype._button_setButtonState = function() { if(this.enabled==false) { this._button_setButtonStyle(this._paramDisabled); } else { if(this._isMouseOver==true && this._isMouseDown==true) { this._button_setButtonStyle(this._paramDown); } else if(this._isMouseOver==true && this._isMouseDown==false) { this._button_setButtonStyle(this._paramOver); } else { this._button_setButtonStyle(this._paramNormal); } } // if enabled } /** * Sets button elements to match current state. * @private * @param {Object} params Object that contains the control style parameters. */ Yahoo.Controls.Button.prototype._button_setButtonStyle = function(params) { if(this._disposing==false) { this._imgLeft.colorize = params.colorize; this._imgLeft.hslAdjustment = params.hslAdjustment; this._imgLeft.hslTinting = params.hslTinting; this._imgLeft.opacity = params.opacity; this._imgMiddle.colorize = params.colorize; this._imgMiddle.hslAdjustment = params.hslAdjustment; this._imgMiddle.hslTinting = params.hslTinting; this._imgMiddle.opacity = params.opacity; this._imgRight.colorize = params.colorize; this._imgRight.hslAdjustment = params.hslAdjustment; this._imgRight.hslTinting = params.hslTinting; this._imgRight.opacity = params.opacity; this._lblText.opacity = params.opacity; } //if disposing } /*---------------------------------------------------------------------*/ // Public code /*---------------------------------------------------------------------*/ /** * True constructor. Must be called if this class is overridden. * @param {Yahoo.Controls.Theme} theme The theme this control should use or null to create an instance of the default theme. */ Yahoo.Controls.Button.prototype.initialize = function(theme) { //log("Button.initialize()"); // Call baseclass constructor this.baseclassButton.initialize.call(this, theme, "button"); // Includes lib.include("Yahoo.Controls.Label"); // Hook into mouse events for whole control this.addEventHandler(this._button_onMouseDown, "MouseDown"); this.addEventHandler(this._button_onMouseUp, "MouseUp"); this._button_loadTheme(); } /** * Disposes control's resources. */ Yahoo.Controls.Button.prototype.dispose = function() { // Dispose native items this._button_disposeNativeObjects(); // Call baseclass this.baseclassButton.dispose.call(this); } /*---------------------------------------------------------------------*/ // Public properties /*---------------------------------------------------------------------*/ /** * Gets or sets the alignment of the text on the button. * @type Yahoo.Drawing.ContentAlignment */ Yahoo.Controls.Button.prototype.textAlign getter = function() { return this._lblText.textAlign; } Yahoo.Controls.Button.prototype.textAlign setter = function(value) { if(value!=null) { this._lblText.textAlign = value; } else { throw new Yahoo.ArgumentNullException("value"); } } DlDO/*---------------------------------------------------------------------*/ /// /// (C) Copyright 2005-2007 Yahoo! Inc. All Rights Reserved. /// /** * CheckBox control. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Constructor /*---------------------------------------------------------------------*/ /** * Default constructor. * @constructor * @param {Yahoo.Controls.Theme} theme The theme this control should use or null to create an instance of the default theme. */ Yahoo.Controls.CheckBox = function(theme) { //log("CheckBox.ctor()"); if(arguments.length>0) { this.initialize(theme); } } /** * Define inheritance chain. */ Yahoo.Controls.CheckBox.prototype = new Yahoo.Controls.Control(); Yahoo.Controls.CheckBox.prototype.constructor = Yahoo.Controls.CheckBox; Yahoo.Controls.CheckBox.prototype.baseclassCheckBox = Yahoo.Controls.Control.prototype; /*-----------------------------------------------------------*/ // Control code /*-----------------------------------------------------------*/ /** * Raises the onEnabledChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBox.prototype._onEnabledChanged = function(sender, e) { //log("CheckBox._onEnabledChanged"); // Call baseclass this.baseclassCheckBox._onEnabledChanged.call(this, sender, e); this._chkCheck.enabled = this.enabled; this._lblText.enabled = this.enabled; } /** * Raises the onFontChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBox.prototype._onFontChanged = function(sender, e) { //log("CheckBox._onFontChanged"); // Call baseclass this.baseclassCheckBox._onFontChanged.call(this, sender, e); this._lblText.font = this.font; } /** * Raises the onForeColorChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBox.prototype._onForeColorChanged = function(sender, e) { //log("CheckBox._onForeColorChanged"); // Call baseclass this.baseclassCheckBox._onForeColorChanged.call(this, sender, e); this._lblText.foreColor = this.foreColor; } /** * Raises the onResize event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBox.prototype._onResize = function(sender, e) { //log("CheckBox._onResize"); // Call baseclass this.baseclassCheckBox._onResize.call(this, sender, e); // Resize check and text this._checkBox_setCheckBoxSize(); this._checkBox_setTextLocation(); } /** * Raises the onTextChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBox.prototype._onTextChanged = function(sender, e) { //log("CheckBox._onTextChanged"); // Call baseclass this.baseclassCheckBox._onTextChanged.call(this, sender, e); // Set text this._lblText.text = this.text; } /** * Raises the onToolTipChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBox.prototype._onToolTipChanged = function(sender, e) { //log("CheckBox._onToolTipChanged"); // Call baseclass this.baseclassCheckBox._onToolTipChanged.call(this, sender, e); // Set tooltip this._lblText.toolTip = this.toolTip; } /** * Handles onEnter event for whole control. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBox.prototype._onEnter = function(sender, e) { //log("CheckBox._onEnter"); // Cancel enter event if we entered from / left one of our subcontrols if((this._isMouseOver == false) || this.displayRectangle.contains(system.event.x + this.left, system.event.y + this.top) == false) { // Call baseclass this.baseclassCheckBox._onEnter.call(this, sender, e); // Send enter event the checkboxbase this._chkCheck._isMouseOver = true; this._chkCheck._checkBoxBase_setCheckBoxBaseState.call(this._chkCheck); } } /** * Handles onLeave event for whole control. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBox.prototype._onLeave = function(sender, e) { //log("CheckBox._onLeave"); // Cancel leave event if we entered one of our subcontrols if(this.displayRectangle.contains(system.event.x + this.left, system.event.y + this.top) == false) { // Call baseclass this.baseclassCheckBox._onLeave.call(this, sender, e); // Send leave event the checkboxbase this._chkCheck._isMouseOver = false; this._chkCheck._checkBoxBase_setCheckBoxBaseState.call(this._chkCheck); } } /** * Handles onMouseDown event for whole control. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBox.prototype._checkBox_onMouseDown = function(sender, e) { //log("CheckBox._checkBox_onMouseDown"); // Send event the checkboxbase sender._chkCheck._isMouseDown = true; sender._chkCheck._checkBoxBase_setCheckBoxBaseState.call(sender._chkCheck); } /** * Handles onMouseUp event for whole control. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBox.prototype._checkBox_onMouseUp = function(sender, e) { //log("CheckBox._checkBox_onMouseUp"); // Send event via the checkboxbase if(e.fromCheckBoxBase != true) { sender._chkCheck._isMouseDown = false; sender._chkCheck._checkBoxBase_onMouseUp.call(sender._chkCheck, sender._chkCheck, new Yahoo.EventArgs()); } } /** * Raises the onThemeChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBox.prototype._onThemeChanged = function(sender, e) { //log("CheckBox._onThemeChanged"); // Call base class this.baseclassCheckBox._onThemeChanged.call(this, sender, e); this._checkBox_loadTheme(); } /** * Handles onMouseEnter event for checkbox. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBox.prototype._checkBox_chkCheck_onEnter = function(sender, e) { //log("CheckBox._checkBox_chkCheck_onEnter"); sender.parent._onEnter.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } /** * Handles onMouseExit event for checkbox. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBox.prototype._checkBox_chkCheck_onLeave = function(sender, e) { //log("CheckBox._checkBox_chkCheck_onLeave"); // Don't forward this if we are still within the parent control if(sender.parent.displayRectangle.contains(system.event.x + sender.left + sender.parent.left, system.event.y + sender.top + sender.parent.top) == false) { sender.parent._onLeave.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } } /** * Handles onMouseDown event for checkbox. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBox.prototype._checkBox_chkCheck_onMouseDown = function(sender, e) { //log("CheckBox._checkBox_chkCheck_onMouseDown"); sender.parent._onMouseDown.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } /** * Handles onMouseUp event for checkbox. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBox.prototype._checkBox_chkCheck_onMouseUp = function(sender, e) { //log("CheckBox._checkBox_chkCheck_onMouseUp"); e = new Yahoo.EventArgs(); e.fromCheckBoxBase = true; // We keep the sender as the checkbox so we don't end up in an infinite loop later sender.parent._checkBox_onMouseUp.call(sender.parent, sender.parent, e); } /** * Handles onMouseEnter event for label. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBox.prototype._checkBox_lblText_onEnter = function(sender, e) { //log("CheckBox._checkBox_lblText_onEnter"); sender.parent._onEnter.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } /** * Handles onMouseExit event for label. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBox.prototype._checkBox_lblText_onLeave = function(sender, e) { //log("CheckBox._checkBox_lblText_onLeave"); // Don't forward this if we are still within the parent control if(sender.parent.displayRectangle.contains(system.event.x + sender.left + sender.parent.left, system.event.y + sender.top + sender.parent.top) == false) { sender.parent._onLeave.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } } /** * Handles onMouseDown event for label. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBox.prototype._checkBox_lblText_onMouseDown = function(sender, e) { //log("CheckBox._checkBox_lblText_onMouseDown"); sender.parent._checkBox_onMouseDown.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } /** * Handles onMouseUp event for label. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBox.prototype._checkBox_lblText_onMouseUp = function(sender, e) { //log("CheckBox._checkBox_lblText_onMouseUp"); sender.parent._checkBox_onMouseUp.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } /*---------------------------------------------------------------------*/ // Private code /*---------------------------------------------------------------------*/ /** * Disposes native Widget Engine objects. * @private */ Yahoo.Controls.CheckBox.prototype._checkBox_disposeNativeObjects = function() { //log("CheckBox._checkBox_disposeNativeObjects"); // These aren't native objects, but we still dispose them here if(this._chkCheck!=null) { this._chkCheck.dispose(); this._chkCheck = null; } if(this._lblText!=null) { this._lblText.dispose(); this._lblText = null; } } /** * Loads control elements based on current theme. * @private */ Yahoo.Controls.CheckBox.prototype._checkBox_loadTheme = function() { var checked = false; if(this._chkCheck != null) { checked = this._chkCheck.checked; } // Remove any current objects this._checkBox_disposeNativeObjects(); this._chkCheck = new Yahoo.Controls.CheckBoxBase(this._theme, "checkBox"); this._chkCheck.left = 0; this._chkCheck.top = 0; this._chkCheck.addEventHandler(this._checkBox_chkCheck_onEnter, "Enter"); this._chkCheck.addEventHandler(this._checkBox_chkCheck_onLeave, "Leave"); this._chkCheck.addEventHandler(this._checkBox_chkCheck_onMouseDown, "MouseDown"); this._chkCheck.addEventHandler(this._checkBox_chkCheck_onMouseUp, "MouseUp"); this.addControl(this._chkCheck); this._lblText = new Yahoo.Controls.Label(this._theme); this._lblText.fromTextObject(this._theme.getItem("checkBoxLabel")); this._lblText.textAlign = Yahoo.Drawing.ContentAlignment.MiddleLeft; this._lblText.addEventHandler(this._checkBox_lblText_onEnter, "Enter"); this._lblText.addEventHandler(this._checkBox_lblText_onLeave, "Leave"); this._lblText.addEventHandler(this._checkBox_lblText_onMouseDown, "MouseDown"); this._lblText.addEventHandler(this._checkBox_lblText_onMouseUp, "MouseUp"); this.addControl(this._lblText); // Get options for checkBox from theme this._textMargins = this._theme.getParameter("checkBoxTextMargins"); this._paramDisabled = this._theme.getParameter("checkBoxDisabled"); this._paramDown = this._theme.getParameter("checkBoxDown"); this._paramNormal = this._theme.getParameter("checkBoxNormal"); this._paramOver = this._theme.getParameter("checkBoxOver"); // Set text this._lblText.text = this.text; this._chkCheck.checked = checked; if(this._isInitializing == true) { // Get initial height from checkbox theme this._frame.height = this._chkCheck.height; } this._checkBox_setCheckBoxSize(); this._checkBox_setTextLocation(); } /** * Sets the size for the checkbox. * @private */ Yahoo.Controls.CheckBox.prototype._checkBox_setCheckBoxSize = function() { //log("CheckBox._checkBox_setCheckBoxSize"); if(this._chkCheck!=null) { this._chkCheck.size = new Yahoo.Drawing.Size(this.height, this.height); } } /** * Sets the location and size for the text label. * @private */ Yahoo.Controls.CheckBox.prototype._checkBox_setTextLocation = function() { //log("CheckBox._checkBox_setTextLocation"); if(this._lblText!=null) { this._lblText.left = this._chkCheck.width + parseInt(this._textMargins.left); this._lblText.top = parseInt(this._textMargins.top); this._lblText.size = new Yahoo.Drawing.Size((this.width - (parseInt(this._textMargins.left) + parseInt(this._textMargins.right)) - this._chkCheck.width - 1), (this.height - (parseInt(this._textMargins.top) + parseInt(this._textMargins.bottom)))); } } /*---------------------------------------------------------------------*/ // Public code /*---------------------------------------------------------------------*/ /** * True constructor. Must be called if this class is overridden. * @param {Yahoo.Controls.Theme} theme The theme this control should use or null to create an instance of the default theme. */ Yahoo.Controls.CheckBox.prototype.initialize = function(theme) { //log("CheckBox.initialize()"); // Call baseclass constructor this.baseclassCheckBox.initialize.call(this, theme, "checkBox"); this._isInitializing = true; // Includes lib.include("Yahoo.Controls.CheckBoxBase"); lib.include("Yahoo.Controls.Label"); // Hook into mouse events for whole control this.addEventHandler(this._checkBox_onMouseDown, "MouseDown"); this.addEventHandler(this._checkBox_onMouseUp, "MouseUp"); // Load theme and do layout this._checkBox_loadTheme(); this._isInitializing = false; } /** * Disposes control's resources. */ Yahoo.Controls.CheckBox.prototype.dispose = function() { this._checkBox_disposeNativeObjects(); // Call baseclass this.baseclassCheckBox.dispose.call(this); } // TODO: We need the events from CheckBoxBase !!! /*---------------------------------------------------------------------*/ // Public properties /*---------------------------------------------------------------------*/ /** * Gets or sets a value indicating whether the checked state changes automatically when the user clicks on the control. * @type Boolean */ Yahoo.Controls.CheckBox.prototype.autoCheck getter = function() { return this._chkCheck.autoCheck; } Yahoo.Controls.CheckBox.prototype.autoCheck setter = function(value) { this._chkCheck.autoCheck = value; } /** * Gets or sets a value indicating whether the control is checked. * @type Boolean */ Yahoo.Controls.CheckBox.prototype.checked getter = function() { return this._chkCheck.checked; } Yahoo.Controls.CheckBox.prototype.checked setter = function(value) { this._chkCheck.checked = value; } /** * Gets or sets the state of the checkbox when in three state mode. * @type Yahoo.Controls.CheckState */ Yahoo.Controls.CheckBox.prototype.checkState getter = function() { return this._chkCheck.checkState; } Yahoo.Controls.CheckBox.prototype.checkState setter = function(value) { this._chkCheck.checkState = value; } /** * Gets or sets a value indicating whether the checkbox supports three states instead of two. * @type Boolean */ Yahoo.Controls.CheckBox.prototype.threeState getter = function() { return this._chkCheck.threeState; } Yahoo.Controls.CheckBox.prototype.threeState setter = function(value) { this._chkCheck.threeState = value; } /** * Gets or sets the alignment of the text on the checkBox. * @type Yahoo.Drawing.ContentAlignment */ Yahoo.Controls.CheckBox.prototype.textAlign getter = function() { return this._lblText.textAlign; } Yahoo.Controls.CheckBox.prototype.textAlign setter = function(value) { if(value!=null) { this._lblText.textAlign = value; } else { throw new Yahoo.ArgumentNullException("value"); } } ImI~A /*---------------------------------------------------------------------*/ /// /// (C) Copyright 2005-2007 Yahoo! Inc. All Rights Reserved. /// /** * CheckBoxBase control. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Constructor /*---------------------------------------------------------------------*/ /** * Default constructor. * @constructor * @param {Yahoo.Controls.Theme} theme The theme this control should use or null to create an instance of the default theme. * @param {String} themePrefix The prefix used to retrieve styles from the theme for this control. */ Yahoo.Controls.CheckBoxBase = function(theme, themePrefix) { //log("CheckBoxBase.ctor()"); if(arguments.length>0) { this.initialize(theme, themePrefix); } } /** * Define inheritance chain. */ Yahoo.Controls.CheckBoxBase.prototype = new Yahoo.Controls.Control(); Yahoo.Controls.CheckBoxBase.prototype.constructor = Yahoo.Controls.CheckBoxBase; Yahoo.Controls.CheckBoxBase.prototype.baseclassCheckBoxBase = Yahoo.Controls.Control.prototype; /*---------------------------------------------------------------------*/ // Public enums /*---------------------------------------------------------------------*/ /** * Available border styles for forms. */ Yahoo.Controls.CheckState = { Unchecked: 0, Checked: 1, Indeterminate: 2 } /*-----------------------------------------------------------*/ // Control code /*-----------------------------------------------------------*/ /** * Raises the onBackColorChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBoxBase.prototype._onBackColorChanged = function(sender, e) { //log("CheckBoxBase._onBackColorChanged"); // Call base class this.baseclassCheckBoxBase._onBackColorChanged.call(this, sender, e); this._imgBackground.colorize = this._backColor; } /** * Control's internal resize handler. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBoxBase.prototype._onResize = function(sender, e) { //log("CheckBoxBase._onResize"); // Call base class this.baseclassCheckBoxBase._onResize.call(this, sender, e); // Resize background this._checkBoxBase_paintBackground(); // Resize text this._checkBoxBase_setCheckLocation(); } /** * Raises the onToolTipChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBoxBase.prototype._onToolTipChanged = function(sender, e) { //log("baseclassCheckBoxBase._onToolTipChanged"); // Call base class this.baseclassCheckBoxBase._onToolTipChanged.call(this, sender, e); // Set tooltip this._imgBackground.tooltip = this.tooltip; this._imgCheck.tooltip = this.tooltip; } /** * Raises the onCheckedChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBoxBase.prototype._onCheckedChanged = function(sender, e) { //log("CheckBoxBase._onCheckedChanged"); this._checkBoxBase_setCheckBoxBaseState(); Yahoo.raiseEvent(sender, sender._onCheckedChangedEventHandlers, e); } /** * Raises the onCheckStateChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBoxBase.prototype._onCheckStateChanged = function(sender, e) { //log("CheckBoxBase._onCheckStateChanged"); this._checkBoxBase_setCheckBoxBaseState(); Yahoo.raiseEvent(sender, sender._onCheckStateChangedEventHandlers, e); } /** * Raises the onEnabledChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBoxBase.prototype._onEnabledChanged = function(sender, e) { //log("CheckBoxBase._onEnabledChanged"); // Call baseclass this.baseclassCheckBoxBase._onEnabledChanged.call(this, sender, e); this._checkBoxBase_setCheckBoxBaseState(); } /** * Handles onEnter event for whole control. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBoxBase.prototype._onEnter = function(sender, e) { //log("CheckBoxBase._onEnter"); // Cancel enter event if we entered from / left one of our subcontrols if((this._isMouseOver == false) || this.displayRectangle.contains(system.event.x + this.left, system.event.y + this.top) == false) { // Call baseclass this.baseclassCheckBoxBase._onEnter.call(this, sender, e); this._checkBoxBase_setCheckBoxBaseState(); } } /** * Handles onLeave event for whole control. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBoxBase.prototype._onLeave = function(sender, e) { //log("CheckBoxBase._onLeave"); // Cancel leave event if we entered one of our subcontrols if(this.displayRectangle.contains(system.event.x + this.left, system.event.y + this.top) == false) { // Call baseclass this.baseclassCheckBoxBase._onLeave.call(this, sender, e); this._checkBoxBase_setCheckBoxBaseState(); } } /** * Handles onMouseDown event for whole control. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBoxBase.prototype._checkBoxBase_onMouseDown = function(sender, e) { //log("CheckBoxBase._checkBoxBase_onMouseDown"); sender._checkBoxBase_setCheckBoxBaseState(); } /** * Handles onMouseUp event for whole control. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBoxBase.prototype._checkBoxBase_onMouseUp = function(sender, e) { //log("CheckBoxBase._checkBoxBase_onMouseUp"); if(sender.enabled==true) { // Check if we should switch states if(sender.autoCheck==true) { if(sender._isMouseOver) { if(sender._threeState==true) { switch(sender._checkState) { case Yahoo.Controls.CheckState.Checked: sender.checkState = Yahoo.Controls.CheckState.Indeterminate; break; case Yahoo.Controls.CheckState.Unchecked: sender.checkState = Yahoo.Controls.CheckState.Checked; break; case Yahoo.Controls.CheckState.Indeterminate: sender.checkState = Yahoo.Controls.CheckState.Unchecked; break; } } else { sender.checked = !sender.checked; } // threeState } // isMouseOver } // autoCheck } // enabled==true sender._checkBoxBase_setCheckBoxBaseState(); } /** * Handles onMouseEnter event for label. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBoxBase.prototype._checkBoxBase_imgCheck_onEnter = function(sender, e) { //log("CheckBoxBase._checkBoxBase_imgCheck_onEnter"); sender.parent._onEnter.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } /** * Handles onMouseExit event for label. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBoxBase.prototype._checkBoxBase_imgCheck_onLeave = function(sender, e) { //log("CheckBoxBase._checkBoxBase_imgCheck_onLeave"); // Don't forward this if we are still within the parent control if(sender.parent.displayRectangle.contains(system.event.x + sender.left + sender.parent.left, system.event.y + sender.top + sender.parent.top) == false) { sender.parent._onLeave.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } } /** * Handles onMouseDown event for check image. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBoxBase.prototype._checkBoxBase_imgCheck_onMouseDown = function(sender, e) { //log("CheckBoxBase._checkBoxBase_imgCheck_onMouseDown"); sender.parent._onMouseDown.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } /** * Handles onMouseUp event for check image. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBoxBase.prototype._checkBoxBase_imgCheck_onMouseUp = function(sender, e) { //log("CheckBoxBase._checkBoxBase_imgCheck_onMouseUp"); sender.parent._onMouseUp.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } /** * Raises the onThemeChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckBoxBase.prototype._onThemeChanged = function(sender, e) { //log("CheckBoxBase._onThemeChanged"); // Call base class this.baseclassCheckBoxBase._onThemeChanged.call(this, sender, e); this._checkBoxBase_loadTheme(); } /*---------------------------------------------------------------------*/ // Private code /*---------------------------------------------------------------------*/ /** * Disposes native Widget Engine objects. * @private */ Yahoo.Controls.CheckBoxBase.prototype._checkBoxBase_disposeNativeObjects = function() { //log("CheckBoxBase._checkBoxBase_disposeNativeObjects"); if(this._imgBackground!=null) { this._imgBackground.removeFromSuperview(); this._imgBackground = null; } if(this._imgCheck!=null) { this._imgCheck.removeFromSuperview(); this._imgCheck = null; } } /** * Loads control elements based on current theme. * @private */ Yahoo.Controls.CheckBoxBase.prototype._checkBoxBase_loadTheme = function() { //log("CheckBoxBase._checkBoxBase_loadTheme"); // Remove any current objects this._checkBoxBase_disposeNativeObjects(); // Load objects using current theme this._imgBackground = this._theme.getItem(this._themePrefix + "Background"); this._imgBackground.tag = this; this._frame.addSubview(this._imgBackground); this._imgCheck = this._theme.getItem(this._themePrefix + "Check"); this._imgCheck.tag = this; this._frame.addSubview(this._imgCheck); this._checkBoxBase_setCheckLocation(); this._checkBoxBase_setCheckBoxBaseState(); } /** * Resizes control border elements. * @private */ Yahoo.Controls.CheckBoxBase.prototype._checkBoxBase_paintBackground = function() { //log("CheckBoxBase._checkBoxBase_paintBackground"); this._imgBackground.width = this.width; this._imgBackground.height = this.height; } /** * Sets the check image location and size * @private */ Yahoo.Controls.CheckBoxBase.prototype._checkBoxBase_setCheckLocation = function() { if(this._imgCheck!=null) { this._imgCheck.hOffset = parseInt(this._checkMargins.left); this._imgCheck.vOffset = parseInt(this._checkMargins.top); this._imgCheck.width = this.width - (parseInt(this._checkMargins.left) + parseInt(this._checkMargins.right)); this._imgCheck.height = this.height - (parseInt(this._checkMargins.top) + parseInt(this._checkMargins.bottom)); } } /** * Sets the checkBoxBase state. * @private */ Yahoo.Controls.CheckBoxBase.prototype._checkBoxBase_setCheckBoxBaseState = function() { if(this.enabled==false) { this._checkBoxBase_setCheckBoxBaseStyle(this._paramDisabled); } else { if(this._isMouseOver==true && this._isMouseDown==true) { this._checkBoxBase_setCheckBoxBaseStyle(this._paramDown); } else if(this._isMouseOver==true && this._isMouseDown==false) { this._checkBoxBase_setCheckBoxBaseStyle(this._paramOver); } else { this._checkBoxBase_setCheckBoxBaseStyle(this._paramNormal); } } // if enabled // Set check image switch(this._checkState) { case Yahoo.Controls.CheckState.Checked: this._imgCheck.opacity = 255; break; case Yahoo.Controls.CheckState.Unchecked: this._imgCheck.opacity = 0; break; case Yahoo.Controls.CheckState.Indeterminate: this._imgCheck.opacity = 128; break; } } /** * Sets checkBoxBase elements to match current state. * @private * @param {Object} params Object that contains the control style parameters. */ Yahoo.Controls.CheckBoxBase.prototype._checkBoxBase_setCheckBoxBaseStyle = function(params) { this._imgBackground.colorize = params.colorize; this._imgBackground.hslAdjustment = params.hslAdjustment; this._imgBackground.hslTinting = params.hslTinting; this._imgBackground.opacity = params.opacity; //this._imgCheck.colorize = params.colorize; this._imgCheck.hslAdjustment = params.hslAdjustment; this._imgCheck.hslTinting = params.hslTinting; this._imgCheck.opacity = params.opacity; } /*---------------------------------------------------------------------*/ // Public code /*---------------------------------------------------------------------*/ /** * True constructor. Must be called if this class is overridden. * @param {Yahoo.Controls.Theme} theme The theme this control should use or null to create an instance of the default theme. * @param {String} themePrefix The prefix used to retrieve styles from the theme for this control. */ Yahoo.Controls.CheckBoxBase.prototype.initialize = function(theme, themePrefix) { //log("CheckBoxBase.initialize()"); this._themePrefix = themePrefix; // Call baseclass constructor this.baseclassCheckBoxBase.initialize.call(this, theme, themePrefix); this._isInitializing = true; // Initialize properties this._autoCheck = true; this._checked = false; this._checkState = Yahoo.Controls.CheckState.Unchecked; this._threeState = false; this._onCheckedChangedEventHandlers = new Array(); this._onCheckStateChangedEventHandlers = new Array(); // Get options for checkBoxBase from theme this._checkMargins = this._theme.getParameter(themePrefix + "CheckMargins"); this._paramDisabled = this._theme.getParameter(themePrefix + "Disabled"); this._paramDown = this._theme.getParameter(themePrefix + "Down"); this._paramNormal = this._theme.getParameter(themePrefix + "Normal"); this._paramOver = this._theme.getParameter(themePrefix + "Over"); // Hook into mouse events for whole control this.addEventHandler(this._checkBoxBase_onMouseDown, "MouseDown"); this.addEventHandler(this._checkBoxBase_onMouseUp, "MouseUp"); // Get objects this._checkBoxBase_loadTheme(); // Get initial size from theme images this.width = this._imgBackground.width; this.height = this._imgBackground.height; this._isInitializing = false; } /** * Adds an event handler. Supported events are: CheckedChanged, CheckStateChanged * @param {Function} eventHandler The function that is to be called when the event is raised. * @param {String} eventName The name of the event that is being listened to. */ Yahoo.Controls.CheckBoxBase.prototype.addEventHandler = function(eventHandler, eventName) { // Call baseclass this.baseclassCheckBoxBase.addEventHandler.call(this, eventHandler, eventName) switch(eventName) { case "CheckedChanged": this._onCheckedChangedEventHandlers.push(eventHandler); break; case "CheckStateChanged": this._onCheckStateChangedEventHandlers.push(eventHandler); break; } } /** * Disposes control's resources. */ Yahoo.Controls.CheckBoxBase.prototype.dispose = function() { // Call baseclass this.baseclassCheckBoxBase.dispose.call(this); } /*---------------------------------------------------------------------*/ // Public properties /*---------------------------------------------------------------------*/ /** * Gets or sets the a value indicating whether the checked state changes automatically when the user click on the control. * @type Boolean */ Yahoo.Controls.CheckBoxBase.prototype.autoCheck getter = function() { return this._autoCheck; } Yahoo.Controls.CheckBoxBase.prototype.autoCheck setter = function(value) { if(value!=null) { this._autoCheck = value; } else { throw new Yahoo.ArgumentNullException("value"); } } /** * Gets or sets the a value indicating whether the control is checked. * @type Boolean */ Yahoo.Controls.CheckBoxBase.prototype.checked getter = function() { return this._checked; } Yahoo.Controls.CheckBoxBase.prototype.checked setter = function(value) { if(value!=null) { if(this._checked!=value) { this._checked = value; if(this._checked==true) { this._checkState = Yahoo.Controls.CheckState.Checked; } else { this._checkState = Yahoo.Controls.CheckState.Unchecked; } this._onCheckedChanged(this, new Yahoo.EventArgs()); } } else { throw new Yahoo.ArgumentNullException("value"); } } /** * Gets or sets the state of the checkbox. * @type Yahoo.Controls.CheckState */ Yahoo.Controls.CheckBoxBase.prototype.checkState getter = function() { return this._checkState; } Yahoo.Controls.CheckBoxBase.prototype.checkState setter = function(value) { if(value!=null) { if(this._checkState!=value) { this._checkState = value; switch(this._checkState) { case Yahoo.Controls.CheckState.Checked: this._checked = true; break; case Yahoo.Controls.CheckState.Unchecked: this._checked = false; break; case Yahoo.Controls.CheckState.Indeterminate: // Invalid setting for two state checkbox this._checked = false; break; } this._onCheckStateChanged(this, new Yahoo.EventArgs()); } } else { throw new Yahoo.ArgumentNullException("value"); } } /** * Gets or sets a value indicating whether the checkbox supports three states instead of two. * @type Boolean */ Yahoo.Controls.CheckBoxBase.prototype.threeState getter = function() { return this._threeState; } Yahoo.Controls.CheckBoxBase.prototype.threeState setter = function(value) { if(value!=null) { if(this._threeState!=value) { this._threeState = value; } } else { throw new Yahoo.ArgumentNullException("value"); } } QV1VO/*---------------------------------------------------------------------*/ /// /// (C) Copyright 2005-2007 Yahoo! Inc. All Rights Reserved. /// /** * CheckedListBox control. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Constructor /*---------------------------------------------------------------------*/ /** * Default constructor. * @constructor * @param {Yahoo.Controls.Theme} theme The theme this control should use or null to create an instance of the default theme. */ Yahoo.Controls.CheckedListBox = function(theme) { //log("CheckedListBox.ctor()"); if(arguments.length>0) { this.initialize(theme); } } /** * Define inheritance chain. */ Yahoo.Controls.CheckedListBox.prototype = new Yahoo.Controls.SizableControlBase(); Yahoo.Controls.CheckedListBox.prototype.constructor = Yahoo.Controls.CheckedListBox; Yahoo.Controls.CheckedListBox.prototype.baseclassCheckedListBox = Yahoo.Controls.SizableControlBase.prototype; /*-----------------------------------------------------------*/ // Control code /*-----------------------------------------------------------*/ /** * Raises the onEnabledChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckedListBox.prototype._onEnabledChanged = function(sender, e) { //log("CheckedListBox._onEnabledChanged"); // Call baseclass this.baseclassCheckedListBox._onEnabledChanged.call(this, sender, e); // TODO: Loop all items } /** * Raises the onFontChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckedListBox.prototype._onFontChanged = function(sender, e) { //log("CheckedListBox._onFontChanged"); // Call baseclass this.baseclassCheckedListBox._onFontChanged.call(this, sender, e); // TODO: Loop all items } /** * Raises the onForeColorChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckedListBox.prototype._onForeColorChanged = function(sender, e) { //log("CheckedListBox._onForeColorChanged"); // Call baseclass this.baseclassCheckedListBox._onForeColorChanged.call(this, sender, e); // TODO: Loop all items } /** * Raises the onResize event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckedListBox.prototype._onResize = function(sender, e) { //log("CheckedListBox._onResize"); // Call baseclass this.baseclassCheckedListBox._onResize.call(this, sender, e); // Resize elements this._checkedListBox_setSize(); } /** * Raises the onToolTipChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckedListBox.prototype._onToolTipChanged = function(sender, e) { //log("CheckedListBox._onToolTipChanged"); // Call baseclass this.baseclassCheckedListBox._onToolTipChanged.call(this, sender, e); // Set tooltip // TODO: Loop all items } /** * Handles onEnter event for whole control. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckedListBox.prototype._onEnter = function(sender, e) { //log("CheckedListBox._onEnter"); // Cancel enter event if we entered from / left one of our subcontrols if((this._isMouseOver == false) || this.displayRectangle.contains(system.event.x + this.left, system.event.y + this.top) == false) { // Call baseclass this.baseclassCheckedListBox._onEnter.call(this, sender, e); } } /** * Handles onLeave event for whole control. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckedListBox.prototype._onLeave = function(sender, e) { //log("CheckedListBox._onLeave"); // Cancel leave event if we entered one of our subcontrols if(this.displayRectangle.contains(system.event.x + this.left, system.event.y + this.top) == false) { // Call baseclass this.baseclassCheckedListBox._onLeave.call(this, sender, e); } } /** * Raises the onThemeChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckedListBox.prototype._onThemeChanged = function(sender, e) { //log("CheckedListBox._onThemeChanged"); // Call base class this.baseclassCheckedListBox._onThemeChanged.call(this, sender, e); this._checkedListBox_loadTheme(); } /** * Handles onMouseEnter event for item. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckedListBox.prototype._checkedListBox_chkItem_onEnter = function(sender, e) { //log("CheckedListBox._checkedListBox_chkItem_onEnter"); sender.parent._onEnter.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } /** * Handles onMouseExit event for item. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckedListBox.prototype._checkedListBox_chkItem_onLeave = function(sender, e) { //log("CheckedListBox._checkedListBox_chkItem_onLeave"); // Don't forward this if we are still within the parent control if(sender.parent.displayRectangle.contains(system.event.x + sender.left + sender.parent.left, system.event.y + sender.top + sender.parent.top) == false) { sender.parent._onLeave.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } } /** * Handles onMouseDown event for item. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckedListBox.prototype._checkedListBox_chkItem_onMouseDown = function(sender, e) { //log("CheckedListBox._checkedListBox_chkItem_onMouseDown"); sender.parent._onMouseDown.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } /** * Handles onMouseUp event for item. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckedListBox.prototype._checkedListBox_chkItem_onMouseUp = function(sender, e) { //log("CheckedListBox._checkedListBox_chkItem_onMouseUp"); sender.parent._onMouseUp.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } /** * Handles onCollectionChanged event for object collection. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.CheckedListBox.prototype._checkedListBox_collection_onCollectionChanged = function(sender, e) { //log("CheckedListBox._checkedListBox_collection_onCollectionChanged"); sender.parent._checkedListBox_refreshItems.call(sender.parent); } /*---------------------------------------------------------------------*/ // Private code /*---------------------------------------------------------------------*/ /** * Disposes native Widget Engine objects. * @private */ Yahoo.Controls.CheckedListBox.prototype._checkedListBox_disposeNativeObjects = function() { //log("CheckedListBox._checkedListBox_disposeNativeObjects"); if(this._scbContent!=null) { this._scbContent.removeFromSuperview(); this._scbContent = null; } if(this._fraContent!=null) { this._fraContent.removeFromSuperview(); this._fraContent = null; } // These aren't native objects, but we still dispose them here } /** * Loads control elements based on current theme. * @private */ Yahoo.Controls.CheckedListBox.prototype._checkedListBox_loadTheme = function() { // Remove any current objects this._checkedListBox_disposeNativeObjects(); var count; // Create client frame and scrollbar this._scbContent = new ScrollBar(); this._scbContent.zOrder = 101; this._scbContent.autoHide = false; this._scbContent.vOffset = this._imgBorderTop.height; this._scbContent.thumbColor = this._theme.getParameter("checkedListBoxScrollBarThumbColor").color; this._fraContent = new Frame(); this._fraContent.zOrder = 100; this.frame.addSubview(this._fraContent); this.frame.addSubview(this._scbContent); this._fraContent.vScrollBar = this._scbContent; // Redraw items this._checkedListBox_refreshItems(); this._checkedListBox_setSize(); } /** * Sets the size for all the items. * @private */ Yahoo.Controls.CheckedListBox.prototype._checkedListBox_setSize = function() { var count; if(this._fraContent!=null) { this._fraContent.hOffset = this._imgBorderLeft.width; this._fraContent.vOffset = this._imgBorderTop.height; this._fraContent.width = this.width - this._scbContent.width - (this._imgBorderLeft.width + this._imgBorderRight.width) - 1; this._fraContent.height = this.height - (this._imgBorderTop.height + this._imgBorderBottom.height); this._scbContent.hOffset = this._fraContent.width + 1; this._scbContent.height = this._fraContent.height; // Loop all items and set theme for(count=0; count=0 && checkedArray[countChecked]=0 && index=0 && index /// (C) Copyright 2005-2006 Yahoo! Inc. All Rights Reserved. /// /** * CheckedListBoxCollection control. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Namespace /*---------------------------------------------------------------------*/ // Create namespace Yahoo.Controls if it doesn't already exist //if(Yahoo==undefined) { var Yahoo = new Object(); } //if(Yahoo.Controls==undefined) { Yahoo.Controls = new Object(); } /*---------------------------------------------------------------------*/ // Constructor /*---------------------------------------------------------------------*/ /** * Default constructor. * @constructor */ Yahoo.Controls.CheckedListBox.ObjectCollection = function() { //log("CheckedListBox.ObjectCollection.ctor()"); this.initialize(); } /*---------------------------------------------------------------------*/ // Private code /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Public code /*---------------------------------------------------------------------*/ /** * True constructor. Must be called if this class is overridden. */ Yahoo.Controls.CheckedListBox.ObjectCollection.prototype.initialize = function() { //log("CheckedListBox.ObjectCollection.initialize()"); this._items = new Array(); this._onCollectionChangedEventHandlers = new Array(); } /** * Adds an event handler. Supported events are: CollectionChanged. * @param {Function} eventHandler The function that is to be called when the event is raised. * @param {String} eventName The name of the event that is being listened to. */ Yahoo.Controls.CheckedListBox.ObjectCollection.prototype.addEventHandler = function(eventHandler, eventName) { switch(eventName) { case "CollectionChanged": this._onCollectionChangedEventHandlers.push(eventHandler); break; } } /** * Adds an item to the collection. * @param {Object} item The item to add to the collection. * @type Integer */ Yahoo.Controls.CheckedListBox.ObjectCollection.prototype.add = function(item) { var result = -1; if(item!=null) { result = this._items.push(item) - 1; Yahoo.raiseEvent(this, this._onCollectionChangedEventHandlers, new Yahoo.EventArgs()); } else { throw new Yahoo.ArgumentNullException("item"); } return result; } /** * Adds an array of items to the collection. * @param {Array} value The array of items to add to the collection. */ Yahoo.Controls.CheckedListBox.ObjectCollection.prototype.addRange = function(value) { var count; if(value!=null) { for(count=0; count=0 && index=0 && index /// (C) Copyright 2005-2007 Yahoo! Inc. All Rights Reserved. /// /** * ComboBox control. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Constructor /*---------------------------------------------------------------------*/ /** * Default constructor. * @constructor * @param {Yahoo.Controls.Theme} theme The theme this control should use or null to create an instance of the default theme. */ Yahoo.Controls.ComboBox = function(theme) { //log("ComboBox.ctor()"); if(arguments.length>0) { this.initialize(theme); } } /** * Define inheritance chain. */ Yahoo.Controls.ComboBox.prototype = new Yahoo.Controls.SizableControlBase(); Yahoo.Controls.ComboBox.prototype.constructor = Yahoo.Controls.ComboBox; Yahoo.Controls.ComboBox.prototype.baseclassComboBox = Yahoo.Controls.SizableControlBase.prototype; /*-----------------------------------------------------------*/ // Control code /*-----------------------------------------------------------*/ /** * Raises the onEnabledChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ComboBox.prototype._onEnabledChanged = function(sender, e) { //log("ComboBox._onEnabledChanged"); // Call baseclass this.baseclassComboBox._onEnabledChanged.call(this, sender, e); this._lblText.enabled = this.enabled; this._comboBox_setComboBoxState(); } /** * Raises the onFontChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ComboBox.prototype._onFontChanged = function(sender, e) { //log("ComboBox._onFontChanged"); // Call baseclass this.baseclassComboBox._onFontChanged.call(this, sender, e); this._lblText.font = this.font; } /** * Raises the onForeColorChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ComboBox.prototype._onForeColorChanged = function(sender, e) { //log("ComboBox._onForeColorChanged"); // Call baseclass this.baseclassComboBox._onForeColorChanged.call(this, sender, e); this._lblText.foreColor = this.foreColor; } /** * Raises the onResize event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ComboBox.prototype._onResize = function(sender, e) { //log("ComboBox._onResize"); // Call baseclass this.baseclassComboBox._onResize.call(this, sender, e); // Resize elements this._comboBox_setButtonLocation(); this._comboBox_setTextLocation(); } /** * Raises the onTextChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ComboBox.prototype._onTextChanged = function(sender, e) { //log("ComboBox._onTextChanged"); // Call baseclass this.baseclassComboBox._onTextChanged.call(this, sender, e); // Set text this._lblText.text = this.text; } /** * Raises the onToolTipChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ComboBox.prototype._onToolTipChanged = function(sender, e) { //log("ComboBox._onToolTipChanged"); // Call baseclass this.baseclassComboBox._onToolTipChanged.call(this, sender, e); // Set tooltip this._lblText.toolTip = this.toolTip; } /** * Handles onEnter event for whole control. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ComboBox.prototype._onEnter = function(sender, e) { //log("ComboBox._onEnter"); // Cancel enter event if we entered from / left one of our subcontrols if((this._isMouseOver == false) || this.displayRectangle.contains(system.event.x + this.left, system.event.y + this.top) == false) { // Call baseclass this.baseclassComboBox._onEnter.call(this, sender, e); this._comboBox_setComboBoxState(); } } /** * Handles onLeave event for whole control. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ComboBox.prototype._onLeave = function(sender, e) { //log("ComboBox._onLeave"); // Cancel leave event if we entered one of our subcontrols if(this.displayRectangle.contains(system.event.x + this.left, system.event.y + this.top) == false) { // Call baseclass this.baseclassComboBox._onLeave.call(this, sender, e); this._comboBox_setComboBoxState(); } } /** * Handles onMouseDown event for whole control. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ComboBox.prototype._comboBox_onMouseDown = function(sender, e) { //log("ComboBox._comboBox_onMouseDown"); sender._comboBox_setComboBoxState(); } /** * Handles onMouseUp event for whole control. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ComboBox.prototype._comboBox_onMouseUp = function(sender, e) { //log("ComboBox._comboBox_onMouseUp"); sender._comboBox_setComboBoxState(); } /** * Raises the onSelectedIndexChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ComboBox.prototype._onSelectedIndexChanged = function(sender, e) { //log("ComboBox._onSelectedIndexChanged"); if(this._selectedIndex!=-1) { this._lblText.text = this._items.item(this._selectedIndex).toString(); } else { this._lblText.text = ""; } // Raise event Yahoo.raiseEvent(sender, sender._onSelectedIndexChangedEventHandlers, e); } /** * Raises the onThemeChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ComboBox.prototype._onThemeChanged = function(sender, e) { //log("ComboBox._onThemeChanged"); // Call base class this.baseclassComboBox._onThemeChanged.call(this, sender, e); this._comboBox_loadTheme(); } /** * Handles onMouseEnter event for label. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ComboBox.prototype._comboBox_lblText_onEnter = function(sender, e) { //log("ComboBox._comboBox_lblText_onEnter"); sender.parent._onEnter.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } /** * Handles onMouseExit event for label. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ComboBox.prototype._comboBox_lblText_onLeave = function(sender, e) { //log("ComboBox._comboBox_lblText_onLeave"); // Don't forward this if we are still within the parent control if(sender.parent.displayRectangle.contains(system.event.x + sender.left + sender.parent.left, system.event.y + sender.top + sender.parent.top) == false) { sender.parent._onLeave.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } } /** * Handles onMouseDown event for label. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ComboBox.prototype._comboBox_lblText_onMouseDown = function(sender, e) { //log("ComboBox._comboBox_lblText_onMouseDown"); sender.parent._comboBox_onMouseDown.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } /** * Handles onMouseUp event for label. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ComboBox.prototype._comboBox_lblText_onMouseUp = function(sender, e) { //log("ComboBox._comboBox_lblText_onMouseUp"); sender.parent._comboBox_onMouseUp.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } /** * Handles onMouseEnter event for image. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ComboBox.prototype._comboBox_btnDropDown_onEnter = function(sender, e) { //log("ComboBox._comboBox_btnDropDown_onEnter"); sender.parent._onEnter.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } /** * Handles onMouseExit event for imagebutton. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ComboBox.prototype._comboBox_btnDropDown_onLeave = function(sender, e) { //log("ComboBox._comboBox_btnDropDown_onLeave"); // Don't forward this if we are still within the parent control if(sender.parent.displayRectangle.contains(system.event.x + sender.left + sender.parent.left, system.event.y + sender.top + sender.parent.top) == false) { sender.parent._onLeave.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } } /** * Handles onMouseDown event for imagebutton. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ComboBox.prototype._comboBox_btnDropDown_onMouseDown = function(sender, e) { //log("ComboBox._comboBox_btnDropDown_onMouseDown"); sender.parent._comboBox_onMouseDown.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } /** * Handles onMouseUp event for imagebutton. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ComboBox.prototype._comboBox_btnDropDown_onMouseUp = function(sender, e) { //log("ComboBox._comboBox_btnDropDown_onMouseUp"); sender.parent._comboBox_onMouseUp.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } /** * Handles onClick event for imagebutton. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ComboBox.prototype._comboBox_btnDropDown_onClick = function(sender, e) { //log("ComboBox._comboBox_btnDropDown_onClick"); sender.parent._comboBox_showMenu.call(sender.parent); } /** * Handles click event for comboitem. */ Yahoo.Controls.ComboBox.prototype._comboBox_item_onClick = function() { //log("ComboBox._comboBox_item_onClick"); this.tag.selectedIndex = this.index; } /*---------------------------------------------------------------------*/ // Private code /*---------------------------------------------------------------------*/ /** * Disposes native Widget Engine objects. * @private */ Yahoo.Controls.ComboBox.prototype._comboBox_disposeNativeObjects = function() { //log("ComboBox._comboBox_disposeNativeObjects"); // These aren't native objects, but we still dispose them here if(this._lblText!=null) { this._lblText.dispose(); this._lblText = null; } if(this._btnDropDown!=null) { this._btnDropDown.dispose(); this._btnDropDown = null; } } /** * Loads control elements based on current theme. * @private */ Yahoo.Controls.ComboBox.prototype._comboBox_loadTheme = function() { var text; if(this._lblText != null) { text = this._lblText.text; } else { text = this.text; } // Remove any current objects this._comboBox_disposeNativeObjects(); this._lblText = new Yahoo.Controls.Label(this._theme); this._lblText.fromTextObject(this._theme.getItem("comboBoxLabel")); this._lblText.textAlign = Yahoo.Drawing.ContentAlignment.MiddleLeft; this._lblText.addEventHandler(this._comboBox_lblText_onEnter, "Enter"); this._lblText.addEventHandler(this._comboBox_lblText_onLeave, "Leave"); this._lblText.addEventHandler(this._comboBox_lblText_onMouseDown, "MouseDown"); this._lblText.addEventHandler(this._comboBox_lblText_onMouseUp, "MouseUp"); this._lblText.zOrder = 4; this.addControl(this._lblText); this._btnDropDown = new Yahoo.Controls.ImageButton(this._theme, "comboBoxButtonNormal", "comboBoxButtonOver", "comboBoxButtonDown", "comboBoxButtonDisabled"); this._btnDropDown.addEventHandler(this._comboBox_btnDropDown_onEnter, "Enter"); this._btnDropDown.addEventHandler(this._comboBox_btnDropDown_onLeave, "Leave"); this._btnDropDown.addEventHandler(this._comboBox_btnDropDown_onMouseDown, "MouseDown"); this._btnDropDown.addEventHandler(this._comboBox_btnDropDown_onMouseUp, "MouseUp"); this._btnDropDown.addEventHandler(this._comboBox_btnDropDown_onClick, "Click"); this._btnDropDown.zOrder = 5; this.addControl(this._btnDropDown); // Get options for comboBox from theme this._textMargins = this._theme.getParameter("comboBoxTextMargins"); this._buttonMargins = this._theme.getParameter("comboBoxButtonMargins"); this._paramDisabled = this._theme.getParameter("comboBoxDisabled"); this._paramDown = this._theme.getParameter("comboBoxDown"); this._paramNormal = this._theme.getParameter("comboBoxNormal"); this._paramOver = this._theme.getParameter("comboBoxOver"); // Restore text this._lblText.text = text; this._comboBox_setButtonLocation(); this._comboBox_setTextLocation(); this._comboBox_setComboBoxStyle(this._paramNormal); } /** * Sets the location and size for the text label. * @private */ Yahoo.Controls.ComboBox.prototype._comboBox_setTextLocation = function() { if(this._lblText!=null) { this._lblText.left = parseInt(this._textMargins.left); this._lblText.top = parseInt(this._textMargins.top); this._lblText.width = this._btnDropDown.left - (parseInt(this._textMargins.left) + parseInt(this._textMargins.right)); this._lblText.height = this.height - (parseInt(this._textMargins.top) + parseInt(this._textMargins.bottom)); } } /** * Sets the location and size for the dropdown button. * @private */ Yahoo.Controls.ComboBox.prototype._comboBox_setButtonLocation = function() { if(this._btnDropDown!=null) { this._btnDropDown.width = this.height - (parseInt(this._buttonMargins.left) + parseInt(this._buttonMargins.right)); this._btnDropDown.left = this.width - this._btnDropDown.width - parseInt(this._buttonMargins.right); this._btnDropDown.top = parseInt(this._buttonMargins.top); this._btnDropDown.height = this.height - (parseInt(this._buttonMargins.top) + parseInt(this._buttonMargins.bottom)); } } /** * Sets the comboBox state. * @private */ Yahoo.Controls.ComboBox.prototype._comboBox_setComboBoxState = function() { if(this.enabled==false) { this._comboBox_setComboBoxStyle(this._paramDisabled); } else { if(this._isMouseOver==true && this._isMouseDown==true) { this._comboBox_setComboBoxStyle(this._paramDown); } else if(this._isMouseOver==true && this._isMouseDown==false) { this._comboBox_setComboBoxStyle(this._paramOver); } else { this._comboBox_setComboBoxStyle(this._paramNormal); } } // if enabled } /** * Sets comboBox elements to match current state. * @private * @param {Object} params Object that contains the control style parameters. */ Yahoo.Controls.ComboBox.prototype._comboBox_setComboBoxStyle = function(params) { this._imgBackground.colorize = params.colorize; this._imgBackground.hslAdjustment = params.hslAdjustment; this._imgBackground.hslTinting = params.hslTinting; this._imgBackground.opacity = params.opacity; this._imgCornerTopLeft.colorize = params.colorize; this._imgCornerTopLeft.hslAdjustment = params.hslAdjustment; this._imgCornerTopLeft.hslTinting = params.hslTinting; this._imgCornerTopLeft.opacity = params.opacity; this._imgCornerTopRight.colorize = params.colorize; this._imgCornerTopRight.hslAdjustment = params.hslAdjustment; this._imgCornerTopRight.hslTinting = params.hslTinting; this._imgCornerTopRight.opacity = params.opacity; this._imgCornerBottomLeft.colorize = params.colorize; this._imgCornerBottomLeft.hslAdjustment = params.hslAdjustment; this._imgCornerBottomLeft.hslTinting = params.hslTinting; this._imgCornerBottomLeft.opacity = params.opacity; this._imgCornerBottomRight.colorize = params.colorize; this._imgCornerBottomRight.hslAdjustment = params.hslAdjustment; this._imgCornerBottomRight.hslTinting = params.hslTinting; this._imgCornerBottomRight.opacity = params.opacity; this._imgBorderTop.colorize = params.colorize; this._imgBorderTop.hslAdjustment = params.hslAdjustment; this._imgBorderTop.hslTinting = params.hslTinting; this._imgBorderTop.opacity = params.opacity; this._imgBorderBottom.colorize = params.colorize; this._imgBorderBottom.hslAdjustment = params.hslAdjustment; this._imgBorderBottom.hslTinting = params.hslTinting; this._imgBorderBottom.opacity = params.opacity; this._imgBorderLeft.colorize = params.colorize; this._imgBorderLeft.hslAdjustment = params.hslAdjustment; this._imgBorderLeft.hslTinting = params.hslTinting; this._imgBorderLeft.opacity = params.opacity; this._imgBorderRight.colorize = params.colorize; this._imgBorderRight.hslAdjustment = params.hslAdjustment; this._imgBorderRight.hslTinting = params.hslTinting; this._imgBorderRight.opacity = params.opacity; this._lblText.opacity = params.opacity; this._btnDropDown.opacity = params.opacity; } /** * Displays menu. * @private */ Yahoo.Controls.ComboBox.prototype._comboBox_showMenu = function() { var count; var menu = new Array(); var point; for(count=0; count0) { point = this.pointToClient(new Yahoo.Drawing.Point(0, this.height)); popupMenu(menu, point.x, point.y); } } /*---------------------------------------------------------------------*/ // Public code /*---------------------------------------------------------------------*/ /** * True constructor. Must be called if this class is overridden. * @param {Yahoo.Controls.Theme} theme The theme this control should use or null to create an instance of the default theme. */ Yahoo.Controls.ComboBox.prototype.initialize = function(theme) { //log("ComboBox.initialize()"); // Call baseclass constructor this.baseclassComboBox.initialize.call(this, theme, "comboBox"); // Includes lib.include("Yahoo.Controls.Label"); lib.include("Yahoo.Controls.ImageButton"); // Initialize variables/controls this._items = new Yahoo.Controls.ComboBox.ObjectCollection(); this._selectedIndex = -1 // Hook into mouse events for whole control this.addEventHandler(this._comboBox_onMouseDown, "MouseDown"); this.addEventHandler(this._comboBox_onMouseUp, "MouseUp"); this._onSelectedIndexChangedEventHandlers = new Array(); this._comboBox_loadTheme(); } /** * Adds an event handler. Supported events are: SelectedIndexChanged. * @param {Function} eventHandler The function that is to be called when the event is raised. * @param {String} eventName The name of the event that is being listened to. */ Yahoo.Controls.ComboBox.prototype.addEventHandler = function(eventHandler, eventName) { // Call baseclass this.baseclassComboBox.addEventHandler.call(this, eventHandler, eventName) switch(eventName) { case "SelectedIndexChanged": this._onSelectedIndexChangedEventHandlers.push(eventHandler); break; } } /** * Disposes control's resources. */ Yahoo.Controls.ComboBox.prototype.dispose = function() { this._comboBox_disposeNativeObjects(); // Call baseclass this.baseclassComboBox.dispose.call(this); // Baseclass disposes our custom controls } /*---------------------------------------------------------------------*/ // Public properties /*---------------------------------------------------------------------*/ /** * Gets the collection of items in the combobox. * @type Yahoo.Controls.ComboBox.ObjectCollection */ Yahoo.Controls.ComboBox.prototype.items getter = function() { return this._items; } Yahoo.Controls.ComboBox.prototype.items setter = function(value) { throw new Error("items is read-only"); } /** * Gets or sets the selected item index. * @type Integer */ Yahoo.Controls.ComboBox.prototype.selectedIndex getter = function() { return this._selectedIndex; } Yahoo.Controls.ComboBox.prototype.selectedIndex setter = function(value) { if(value!=null) { if(this._selectedIndex!=value) { if(value<-1 || value>=this._items.count) { throw new Yahoo.ArgumentOutOfRangeException("value"); } else { this._selectedIndex = value; this._onSelectedIndexChanged(this, new Yahoo.EventArgs()); } } } else { throw new Yahoo.ArgumentNullException("value"); } } /** * Gets or sets the alignment of the text on the comboBox. * @type Yahoo.Drawing.ContentAlignment */ Yahoo.Controls.ComboBox.prototype.textAlign getter = function() { return this._lblText.textAlign; } Yahoo.Controls.ComboBox.prototype.textAlign setter = function(value) { if(value!=null) { this._lblText.textAlign = value; } else { throw new Yahoo.ArgumentNullException("value"); } } /*---------------------------------------------------------------------*/ /// /// (C) Copyright 2005-2006 Yahoo! Inc. All Rights Reserved. /// /** * ComboBoxCollection control. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Namespace /*---------------------------------------------------------------------*/ // Create namespace Yahoo.Controls if it doesn't already exist if(Yahoo==undefined) { var Yahoo = new Object(); } if(Yahoo.Controls==undefined) { Yahoo.Controls = new Object(); } /*---------------------------------------------------------------------*/ // Constructor /*---------------------------------------------------------------------*/ /** * Default constructor. */ Yahoo.Controls.ComboBox.ObjectCollection = function() { //log("ComboBox.ObjectCollection.ctor()"); this.initialize(); } /*---------------------------------------------------------------------*/ // Public code /*---------------------------------------------------------------------*/ /** * True constructor. Must be called if this class is overridden. */ Yahoo.Controls.ComboBox.ObjectCollection.prototype.initialize = function() { //log("ComboBox.ObjectCollection.initialize()"); this._items = new Array(); } /** * Adds an item to the collection. * @param {Object} item The item to add to the collection. * @type Integer */ Yahoo.Controls.ComboBox.ObjectCollection.prototype.add = function(item) { var result = -1; if(item!=null) { result = this._items.push(item) - 1; } else { throw new Yahoo.ArgumentNullException("item"); } return result; } /** * Removes all items from the collection. */ Yahoo.Controls.ComboBox.ObjectCollection.prototype.clear = function() { delete this._items; this._items = new Array(); } /** * Gets the index of the given item. * @param {Object} item The item to to find in the collection. * @type Integer */ Yahoo.Controls.ComboBox.ObjectCollection.prototype.indexOf = function(item) { var count; var result = -1; if(item!=null) { // Find the item for(count=0; count=0 && index=0 && index /// (C) Copyright 2005-2007 Yahoo! Inc. All Rights Reserved. /// /** * Base class for all controls. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Namespace /*---------------------------------------------------------------------*/ // Create namespace if it doesn't already exist if(Yahoo==undefined) { var Yahoo = new Object(); } if(Yahoo.Controls==undefined) { Yahoo.Controls = new Object(); } /*---------------------------------------------------------------------*/ // Constructor /*---------------------------------------------------------------------*/ /** * Default constructor. * @constructor * @param {Yahoo.Controls.Theme} theme The theme this control should use or null to create an instance of the default theme. */ Yahoo.Controls.Control = function(theme) { if(arguments.length>0) { this.initialize(theme); } } /*-----------------------------------------------------------*/ // Control code /*-----------------------------------------------------------*/ /** * Raises the onBackColorChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Control.prototype._onBackColorChanged = function(sender, e) { //log("Control._onBackColorChanged"); this._frame.style.backgroundColor = this._backColor; Yahoo.raiseEvent(sender, sender._onBackColorChangedEventHandlers, e); } /** * Raises the onClick event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Control.prototype._onClick = function(sender, e) { //log("Control._onClick"); if(this.enabled == true) { Yahoo.raiseEvent(sender, sender._onClickEventHandlers, e); } } /** * Raises the onEnabledChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Control.prototype._onEnabledChanged = function(sender, e) { //log("Control._onEnabledChanged"); Yahoo.raiseEvent(sender, sender._onEnabledChangedEventHandlers, e); } /** * Raises the onEnter event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Control.prototype._onEnter = function(sender, e) { //log("Control._onEnter"); this._isMouseOver = true; if(this.enabled == true) { Yahoo.raiseEvent(sender, sender._onEnterEventHandlers, e); } } /** * Raises the onFontChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Control.prototype._onFontChanged = function(sender, e) { //log("Control._onFontChanged"); Yahoo.raiseEvent(sender, sender._onFontChangedEventHandlers, e); } /** * Raises the onForeColorChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Control.prototype._onForeColorChanged = function(sender, e) { //log("Control._onForeColorChanged"); Yahoo.raiseEvent(sender, sender._onForeColorChangedEventHandlers, e); } /** * Raises the onLeave event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Control.prototype._onLeave = function(sender, e) { //log("Control._onLeave"); this._isMouseOver = false; if(this.enabled == true) { Yahoo.raiseEvent(sender, sender._onLeaveEventHandlers, e); } } /** * Raises the onLocationChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Control.prototype._onLocationChanged = function(sender, e) { //log("Control._onLocationChanged"); Yahoo.raiseEvent(this, this._onLocationChangedEventHandlers, new Yahoo.EventArgs()); } /** * Raises the onMouseDown event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Control.prototype._onMouseDown = function(sender, e) { //log("Control._onMouseDown"); this._isMouseDown = true; if(this.enabled == true) { Yahoo.raiseEvent(sender, sender._onMouseDownEventHandlers, e); } } /** * Raises the onMouseDrag event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Control.prototype._onMouseDrag = function(sender, e) { //log("Control._onMouseDrag"); if(this.enabled == true) { Yahoo.raiseEvent(sender, sender._onMouseDragEventHandlers, e); } } /** * Raises the onMouseUp event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Control.prototype._onMouseUp = function(sender, e) { //log("Control._onMouseUp"); this._isMouseDown = false; // Raise click event if(this._isMouseOver==true) { this._onClick.call(sender, sender, new Yahoo.EventArgs()); } if(this.enabled == true) { Yahoo.raiseEvent(sender, sender._onMouseUpEventHandlers, e); } } /** * Raises the onOpacityChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Control.prototype._onOpacityChanged = function(sender, e) { //log("Control._onOpacityChanged"); Yahoo.raiseEvent(this, this._onOpacityChangedEventHandlers, new Yahoo.EventArgs()); } /** * Raises the onResize event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Control.prototype._onResize = function(sender, e) { //log("Control._onResize"); Yahoo.raiseEvent(sender, sender._onResizeEventHandlers, e); } /** * Raises the onTextChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Control.prototype._onTextChanged = function(sender, e) { //log("Control._onTextChanged"); Yahoo.raiseEvent(sender, sender._onTextChangedEventHandlers, e); } /** * Raises the onThemeChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Control.prototype._onThemeChanged = function(sender, e) { //log("Control._onThemeChanged"); // TODO: Check if this points to the correct object (should be changed to the control from here on) Yahoo.raiseEvent(this, this._onThemeChangedEventHandlers, e); } /** * Raises the onToolTipChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Control.prototype._onToolTipChanged = function(sender, e) { //log("Control._onToolTipChanged"); Yahoo.raiseEvent(sender, sender._onToolTipChangedChangedEventHandlers, e); } /** * Raises the onVisibleChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Control.prototype._onVisibleChanged = function(sender, e) { //log("Control._onVisibleChanged"); Yahoo.raiseEvent(sender, sender._onVisibleChangedEventHandlers, e); } /** * Handles onMouseDown event for control objects. */ Yahoo.Controls.Control.prototype._control_onMouseDown = function() { //log("Control._control_onMouseDown"); this.tag._onMouseDown.call(this.tag, this.tag, new Yahoo.EventArgs()); } /** * Handles onMouseEnter event for control objects. */ Yahoo.Controls.Control.prototype._control_onMouseEnter = function() { //log("Control._control_onMouseEnter"); this.tag._onEnter.call(this.tag, this.tag, new Yahoo.EventArgs()); } /** * Handles onMouseExit event for control objects. */ Yahoo.Controls.Control.prototype._control_onMouseExit = function() { //log("Control._control_onMouseExit"); this.tag._onLeave.call(this.tag, this.tag, new Yahoo.EventArgs()); } /** * Handles onMouseDrag event for control objects. */ Yahoo.Controls.Control.prototype._control_onMouseDrag = function() { //log("Control._control_onMouseDrag"); this.tag._onMouseDrag.call(this.tag, this.tag, new Yahoo.EventArgs()); } /** * Handles onMouseUp event for control objects. */ Yahoo.Controls.Control.prototype._control_onMouseUp = function() { //log("Control._control_onMouseUp"); this.tag._onMouseUp.call(this.tag, this.tag, new Yahoo.EventArgs()); } /*---------------------------------------------------------------------*/ // Private code /*---------------------------------------------------------------------*/ /** * Disposes controls. * @private */ Yahoo.Controls.Control.prototype._control_disposeControls = function() { var count; // Tell Widget Class Library controls to dispose for(count=0; count0) { return true; } else { return false; } return this._controls; } Yahoo.Controls.Control.prototype.hasChildren setter = function(value) { throw new Error("hasChildren is read-only"); } /** * Gets or sets the x-coordinate of the left edge of this control. * @type Integer */ Yahoo.Controls.Control.prototype.left getter = function() { if(this._disposing==false) { return this._frame.hOffset; } } Yahoo.Controls.Control.prototype.left setter = function(value) { if(value!=null) { this._control_setLocation(value, this.top); } else { throw new Yahoo.ArgumentNullException("value"); } } /** * Gets or sets the height of the control. * @type Integer */ Yahoo.Controls.Control.prototype.height getter = function() { if(this._disposing==false) { return this._frame.height; } } Yahoo.Controls.Control.prototype.height setter = function(value) { if(value!=null) { if(this._frame.height != value) { this._control_setSize(this._frame.width, value); } } else { throw new Yahoo.ArgumentNullException("value"); } } /** * Gets or sets the control frame's id. * @type String */ Yahoo.Controls.Control.prototype.id getter = function() { return this._frame.id; } Yahoo.Controls.Control.prototype.id setter = function(value) { this._frame.id = value; } /** * Gets or sets a value specifying opacity of the control. * @type Integer */ Yahoo.Controls.Control.prototype.opacity getter = function() { if(this._disposing==false) { return this._frame.opacity; } } Yahoo.Controls.Control.prototype.opacity setter = function(value) { if(value!=null) { if(this._frame.opacity!=value) { this._frame.opacity = value; this._onOpacityChanged(this, new Yahoo.EventArgs()); } } else { throw new Yahoo.ArgumentNullException("value"); } } /** * Gets or sets the parent of this control. * @type Yahoo.Controls.Control */ Yahoo.Controls.Control.prototype.parent getter = function() { return this._parent; } Yahoo.Controls.Control.prototype.parent setter = function(value) { if(value!=null) { this._parent = value; } else { throw new Yahoo.ArgumentNullException("value"); } } /** * Gets or sets the width & height of the control. * @type Yahoo.Drawing.Size */ Yahoo.Controls.Control.prototype.size getter = function() { if(this._disposing==false) { return new Yahoo.Drawing.Size(this._frame.width, this._frame.height); } } Yahoo.Controls.Control.prototype.size setter = function(value) { if(value!=null) { this._control_setSize(value.width, value.height); } else { throw new Yahoo.ArgumentNullException("value"); } } /** * Gets or sets the control text. * @type String */ Yahoo.Controls.Control.prototype.text getter = function() { return this._text; } Yahoo.Controls.Control.prototype.text setter = function(value) { if(this._text!=value) { this._text = value; this._onTextChanged(this, new Yahoo.EventArgs()); } } /** * Gets or sets the control theme. * @type Yahoo.Controls.Theme */ Yahoo.Controls.Control.prototype.theme getter = function() { return this._theme; } Yahoo.Controls.Control.prototype.theme setter = function(value) { if(value!=null) { //if(this._theme!=value) { this._theme = value; this._onThemeChanged(this, new Yahoo.EventArgs()); //} } else { throw new Yahoo.ArgumentNullException("value"); } } /** * Gets or sets the tooltip displayed for this control. * @type String */ Yahoo.Controls.Control.prototype.toolTip getter = function() { return this._toolTip; } Yahoo.Controls.Control.prototype.toolTip setter = function(value) { if(value!=null) { if(this._toolTip!=value) { this._toolTip = value; this._onToolTipChanged(this, new Yahoo.EventArgs()); } } else { this._toolTip = ""; } } /** * Gets or sets the y-coordinate of the top edge of this control. * @type Integer */ Yahoo.Controls.Control.prototype.top getter = function() { if(this._disposing==false) { return this._frame.vOffset; } } Yahoo.Controls.Control.prototype.top setter = function(value) { if(value!=null) { this._control_setLocation(this.left, value); } else { throw new Yahoo.ArgumentNullException("value"); } } /** * Gets or sets a value specifying whether the control is visible. * @type Boolean */ Yahoo.Controls.Control.prototype.visible getter = function() { if(this._disposing==false) { return this._frame.visible; } } Yahoo.Controls.Control.prototype.visible setter = function(value) { if(value!=null) { if(this._frame.visible!=value) { this._frame.visible = value; this._onVisibleChanged(this, new Yahoo.EventArgs()); } } else { throw new Yahoo.ArgumentNullException("value"); } } /** * Gets or sets the width of the control. * @type Integer */ Yahoo.Controls.Control.prototype.width getter = function() { if(this._disposing==false) { return this._frame.width; } } Yahoo.Controls.Control.prototype.width setter = function(value) { if(value!=null) { if(this._frame.width != value) { this._control_setSize(value, this._frame.height); } } else { throw new Yahoo.ArgumentNullException("value"); } } /** * Gets or sets the Window that contains this control. * @type Window */ Yahoo.Controls.Control.prototype.window getter = function() { if(this._disposing==false) { return this._frame.window; } } Yahoo.Controls.Control.prototype.window setter = function(value) { this._frame.window = value; } /** * Gets or sets the zOrder of this control. * @type Integer */ Yahoo.Controls.Control.prototype.zOrder getter = function() { if(this._disposing==false) { return this._frame.zOrder; } } Yahoo.Controls.Control.prototype.zOrder setter = function(value) { if(value!=null) { this._frame.zOrder = value; } else { throw new Yahoo.ArgumentNullException("value"); } } ܞtqkW/*---------------------------------------------------------------------*/ /// /// (C) Copyright 2005-2006 Yahoo! Inc. All Rights Reserved. /// /** * Form control. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Constructor /*---------------------------------------------------------------------*/ /** * Default constructor. * @constructor * @param {Yahoo.Controls.Theme} theme The theme this control should use or null to create an instance of the default theme. */ Yahoo.Controls.Form = function(theme) { //log("Form.ctor()"); if(arguments.length>0) { this.initialize(theme); } } /** * Define inheritance chain. */ Yahoo.Controls.Form.prototype = new Yahoo.Controls.Control(); Yahoo.Controls.Form.prototype.constructor = Yahoo.Controls.Form; Yahoo.Controls.Form.prototype.baseclassForm = Yahoo.Controls.Control.prototype; /*---------------------------------------------------------------------*/ // Public enums /*---------------------------------------------------------------------*/ /** * Available return codes for a form. */ Yahoo.Controls.DialogResult = { None: 0, OK: 1, Cancel: 2, Abort: 3, Retry: 4, Ignore: 5, Yes: 6, No: 7 } /** * Available border styles for forms. */ Yahoo.Controls.FormBorderStyle = { None: 0, FixedSingle: 1, Fixed: 2, Sizable: 4 } /*-----------------------------------------------------------*/ // Control code /*-----------------------------------------------------------*/ /** * Raises the onBackColorChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Form.prototype._onBackColorChanged = function(sender, e) { //log("Form._onBackColorChanged"); // Override base class so we don't change the whole frame's background color //this.baseclassForm._onBackColorChanged.call(this, sender, e); Yahoo.raiseEvent(sender, sender._onBackColorChangedEventHandlers, e); this._clientFrame.style.backgroundColor = this._backColor; } /** * Raises the onBorderColorChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Form.prototype._onBorderColorChanged = function(sender, e) { //log("Form._onBorderColorChanged"); this._imgBorderBottom.colorize = this._borderColor; this._imgBorderLeft.colorize = this._borderColor; this._imgBorderRight.colorize = this._borderColor; this._imgBorderTop.colorize = this._borderColor; Yahoo.raiseEvent(sender, sender._onBorderColorChangedEventHandlers, e); } /** * Raises the onClosing event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Form.prototype._onClosing = function(sender, e) { //log("Form._onClosing"); Yahoo.raiseEvent(sender, sender._onClosingEventHandlers, e); } /** * Raises the onClosed event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Form.prototype._onClosed = function(sender, e) { //log("Form._onClosed"); Yahoo.raiseEvent(sender, sender._onClosedEventHandlers, e); } /** * Raises the onResize event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Form.prototype._onResize = function(sender, e) { //log("Form._onResize"); var count; // sender = top level control that inherits from us // this = Form // Set client frame size if(this._disposing==false) { this._form_setClientFrameSize(); // Resize borders and background this._form_resizePaintBackground(); } // Call base class this.baseclassForm._onResize.call(this, sender, e); } /** * Raises the onFormBorderStyleChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Form.prototype._onFormBorderStyleChanged = function(sender, e) { //log("Form._onFormBorderStyleChanged"); this._form_loadTheme(); // Default to movable this._imgBorderTop.onMouseDown = this._border_onMouseDown; this._imgBorderTop.onMouseDrag = this._borderTop_onMouseDrag; switch(this._formBorderStyle) { case Yahoo.Controls.FormBorderStyle.None: case Yahoo.Controls.FormBorderStyle.FixedSingle: this._imgBorderTop.onMouseDown = ""; this._imgBorderTop.onMouseDrag = ""; // Falls thru to the following case Yahoo.Controls.FormBorderStyle.Fixed: this._imgBorderBottom.onMouseDown = ""; this._imgBorderBottom.onMouseDrag = ""; this._imgBorderLeft.onMouseDown = ""; this._imgBorderLeft.onMouseDrag = ""; this._imgBorderRight.onMouseDown = ""; this._imgBorderRight.onMouseDrag = ""; this._imgCornerBottomLeft.onMouseDown = ""; this._imgCornerBottomLeft.onMouseDrag = ""; this._imgCornerBottomRight.onMouseDown = ""; this._imgCornerBottomRight.onMouseDrag = ""; this._imgCornerTopLeft.onMouseDown = ""; this._imgCornerTopLeft.onMouseDrag = ""; this._imgCornerTopRight.onMouseDown = ""; this._imgCornerTopRight.onMouseDrag = ""; break; case Yahoo.Controls.FormBorderStyle.Sizable: this._imgBorderBottom.onMouseDown = this._border_onMouseDown; this._imgBorderBottom.onMouseDrag = this._borderBottom_onMouseDrag; this._imgBorderLeft.onMouseDown = this._border_onMouseDown; this._imgBorderLeft.onMouseDrag = this._borderLeft_onMouseDrag; this._imgBorderRight.onMouseDown = this._border_onMouseDown; this._imgBorderRight.onMouseDrag = this._borderRight_onMouseDrag; this._imgBorderTop.onMouseDown = this._border_onMouseDown; this._imgBorderTop.onMouseDrag = this._borderTop_onMouseDrag; this._imgCornerBottomLeft.onMouseDown = this._border_onMouseDown; this._imgCornerBottomLeft.onMouseDrag = this._cornerBottomLeft_onMouseDrag; this._imgCornerBottomRight.onMouseDown = this._border_onMouseDown; this._imgCornerBottomRight.onMouseDrag = this._cornerBottomRight_onMouseDrag; this._imgCornerTopLeft.onMouseDown = this._border_onMouseDown; this._imgCornerTopLeft.onMouseDrag = this._cornerTopLeft_onMouseDrag; this._imgCornerTopRight.onMouseDown = this._border_onMouseDown; this._imgCornerTopRight.onMouseDrag = this._cornerTopRight_onMouseDrag; break; } // switch Yahoo.raiseEvent(sender, sender._onFormBorderStyleChangedEventHandlers, e); Yahoo.raiseEvent(sender, sender._onResizeEventHandlers, new Yahoo.EventArgs()); } /** * Raises the onOpacityChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Form.prototype._onOpacityChanged = function(sender, e) { //log("Form._onOpacityChanged"); // Call base class this.baseclassForm._onOpacityChanged.call(this, sender, e); this._window.opacity = this.opacity; } /** * Raises the onTextChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Form.prototype._onTextChanged = function(sender, e) { //log("Form._onTextChanged"); // Call base class this.baseclassForm._onTextChanged.call(this, sender, e); this._lblCaption.text = this.text; } /** * Handles onMouseDown event for border elements that can move or resize the window. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Form.prototype._border_onMouseDown = function() { //log("Form._border_onMouseDown"); this.tag._sizeStartX = system.event.x; this.tag._sizeStartY = system.event.y; } /** * Handles onMouseDrag event for a border element. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Form.prototype._borderBottom_onMouseDrag = function() { //log("Form._borderBottom_onMouseDrag"); this.tag._form_setSize(this.tag.width, (this.tag._sizeStartY + system.event.vOffset)); } /** * Handles onMouseDrag event for a border element. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Form.prototype._borderLeft_onMouseDrag = function() { //log("Form._borderLeft_onMouseDrag"); this.tag._form_setSize((this.tag.width - system.event.hOffset), this.tag.height); this.tag.left = this.tag.left + system.event.hOffset; } /** * Handles onMouseDrag event for a border element. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Form.prototype._borderRight_onMouseDrag = function() { //log("Form._borderRight_onMouseDrag"); this.tag._form_setSize((this.tag._sizeStartX + system.event.hOffset), this.tag.height); } /** * Handles onMouseDrag event for a border element. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Form.prototype._borderTop_onMouseDrag = function() { //log("Form._borderTop_onMouseDrag"); // Move window this.tag.left = this.tag.left + system.event.hOffset - this.tag._sizeStartX; this.tag.top = this.tag.top + system.event.vOffset - this.tag._sizeStartY; } /** * Handles onMouseDrag event for a border element. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Form.prototype._cornerBottomLeft_onMouseDrag = function() { //log("Form._cornerBottomLeft_onMouseDrag"); this.tag._form_setSize((this.tag.width - system.event.hOffset), (this.tag._sizeStartY + system.event.vOffset)); this.tag.left = this.tag.left + system.event.hOffset; } /** * Handles onMouseDrag event for a border element. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Form.prototype._cornerBottomRight_onMouseDrag = function() { //log("Form._cornerBottomRight_onMouseDrag"); this.tag._form_setSize((this.tag._sizeStartX + system.event.hOffset), (this.tag._sizeStartY + system.event.vOffset)); } /** * Handles onMouseDrag event for a border element. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Form.prototype._cornerTopLeft_onMouseDrag = function() { //log("Form._cornerTopLeft_onMouseDrag"); this.tag._form_setSize((this.tag.width - system.event.hOffset), (this.tag.height - system.event.vOffset)); this.tag.top = this.tag.top + system.event.vOffset; this.tag.left = this.tag.left + system.event.hOffset; } /** * Handles onMouseDrag event for a border element. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Form.prototype._cornerTopRight_onMouseDrag = function() { //log("Form._cornerTopRight_onMouseDrag"); this.tag._form_setSize((this.tag._sizeStartX + system.event.hOffset), (this.tag.height - system.event.vOffset)); this.tag.top = this.tag.top + system.event.vOffset; } /** * Handles onMouseEnter event for label. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Form.prototype._form_lblCaption_onEnter = function(sender, e) { //log("Form._form_lblCaption_onEnter"); sender.parent._onEnter.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } /** * Handles onMouseExit event for label. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Form.prototype._form_lblCaption_onLeave = function(sender, e) { //log("Form._form_lblCaption_onLeave"); // Don't forward this if we are still within the parent control if(sender.parent.displayRectangle.contains(system.event.x + sender.left + sender.parent.left, system.event.y + sender.top + sender.parent.top) == false) { sender.parent._onLeave.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } } /** * Handles onMouseDown event for label. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Form.prototype._form_lblCaption_onMouseDown = function(sender, e) { //log("Form._form_lblCaption_onMouseDown"); sender.parent._sizeStartX = system.event.x; sender.parent._sizeStartY = system.event.y; } /** * Handles onMouseDrag event for label. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Form.prototype._form_lblCaption_onMouseDrag = function(sender, e) { //log("Form._form_lblCaption_onMouseDrag"); // Move window sender.parent.left = sender.parent.left + system.event.hOffset - sender.parent._sizeStartX; sender.parent.top = sender.parent.top + system.event.vOffset - sender.parent._sizeStartY; } /** * Handles onClick event for button. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Form.prototype._form_btnClose_onClick = function(sender, e) { //log("Form._form_btnClose_onClick"); sender.parent.close(); } /** * Raises the onThemeChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Form.prototype._onThemeChanged = function(sender, e) { //log("Form._onThemeChanged"); // Call base class this.baseclassForm._onThemeChanged.call(this, sender, e); // Load style and theme this._onFormBorderStyleChanged(this, new Yahoo.EventArgs()); // Loop all contained controls and set theme for(count=0; count0) { itemPaddingLeft += parseInt(this._buttonMargins.left); } this._btnClose.left = itemPaddingLeft; itemPaddingLeft += this._btnClose.width + parseInt(this._buttonMargins.right); itemCountLeft +=1; } else { if(itemCountRight>0) { itemPaddingRight += parseInt(this._buttonMargins.right); } this._btnClose.left = width - this._btnClose.width - itemPaddingRight; itemPaddingRight += this._btnClose.width + parseInt(this._buttonMargins.left); itemCountRight +=1; } // alignment } //showButtonClose // Caption this._lblCaption.left = itemPaddingLeft; this._lblCaption.top = parseInt(this._titlebarMargins.top) + parseInt(this._captionMargins.top); this._lblCaption.width = width - (itemPaddingLeft + itemPaddingRight); this._lblCaption.height = this._imgBorderTop.height - (parseInt(this._titlebarMargins.top) + parseInt(this._captionMargins.top)) - (parseInt(this._titlebarMargins.bottom) + parseInt(this._captionMargins.bottom)); } /** * Resizes window border elements. * @private */ Yahoo.Controls.Form.prototype._form_paintBackground = function() { var width = this.width; var height = this.height; this._imgCornerTopLeft.hOffset = 0; this._imgCornerTopLeft.vOffset = 0; // Size from image this._imgCornerTopRight.vOffset = 0; // Size from image this._imgCornerBottomLeft.hOffset = 0; // Size from image // Top border width is width - (corner widths) this._imgBorderTop.vOffset = 0; // Height from image // Left border height is height - (corner heights) this._imgBorderLeft.hOffset = 0; this._imgBorderLeft.vOffset = this._imgCornerTopLeft.height; // Width from image // Right border height is height - (corner heights) this._imgBorderRight.vOffset = this._imgCornerTopRight.height; // Width from image this._form_resizePaintBackground(); } /** * Changes the control size. * @private * @param {Integer} width The width of the form. * @param {Integer} height The height of the form. */ Yahoo.Controls.Form.prototype._form_setSize = function(width, height) { // NOTE: This function overrides baseclass var notify = false; //log("Form._form_setSize()"); // Check against constraints if(this._minimumWidth != -1) { if(width < this._minimumWidth) { width = this._minimumWidth } } if(this._minimumHeight != -1) { if(height < this._minimumHeight) { height = this._minimumHeight } } if(this._maximumWidth != -1) { if(width > this._maximumWidth) { width = this._maximumWidth } } if(this._maximumHeight != -1) { if(height > this._maximumHeight) { height = this._maximumHeight } } if(width!=this._frame.width) { this._window.width = width; this._frame.width = width; notify = true; } if(height!=this._window.height) { this._window.height = height; this._frame.height = height; notify = true; } if(notify==true) { this._onResize(this, new Yahoo.EventArgs()); } } /** * Changes the control location. * @private * @param {Integer} left The left edge of the form. * @param {Integer} top The top edge of the form. */ Yahoo.Controls.Form.prototype._form_setLocation = function(left, top) { // NOTE: This function overrides baseclass var notify = false; //log("Form._form_setLocation()"); if(left!=this._window.hOffset) { this._window.hOffset = left; notify = true; } if(top!=this._window.vOffset) { this._window.vOffset = top; notify = true; } if(notify==true) { this._onLocationChanged(this, new Yahoo.EventArgs()); } } /*-----------------------------------------------------------*/ // Public code /*-----------------------------------------------------------*/ /** * Initializes control. * @param {Yahoo.Controls.Theme} theme The theme this control should use or null to create an instance of the default theme. */ Yahoo.Controls.Form.prototype.initialize = function(theme) { //log("Form.initialize()"); // Call base class this.baseclassForm.initialize.call(this, theme); // Includes lib.include("Yahoo.InvalidEnumArgumentException"); lib.include("Yahoo.Controls.Label"); lib.include("Yahoo.Controls.ImageButton"); // Internal objects this._window = new Window(); // There is a bug in the Mac version and weird things happen if you try to set options to a window that is not visible //this._window.visible = false; this._window.locked = true; this._window.alignment = "left"; this._window.shadow = false; // Move base controls frame into our window this._frame.window = this._window; this._frame.zOrder = 0; // Create a frame for the client area this._clientFrame = new Frame(); this._clientFrame.zOrder = 1000; this._frame.addSubview(this._clientFrame); // Misc this._sizeStartX = 0; this._sizeStartX = 0; // Form properties this._backColor = null; this._clientFrame.style.backgroundColor = this._backColor; this._borderColor = "#000000"; this._formBorderStyle = Yahoo.Controls.FormBorderStyle.Sizable; this._minimumWidth = -1; this._minimumHeight = -1; this._maximumWidth = -1; this._maximumHeight = -1; this._closeBox = true; this._dialogResult = Yahoo.Controls.DialogResult.None; // Events this._onBorderColorChangedEventHandlers = new Array(); this._onClosingEventHandlers = new Array(); this._onClosedEventHandlers = new Array(); // Load image objects this._form_loadTheme(); // Update styles and theme this._onFormBorderStyleChanged(this, new Yahoo.EventArgs()); // Resize window to position all elements this._form_setSize(300,300); } /** * Adds a control to the controls collection. * @param {Yahoo.Controls.Control} value The control to add to this form. */ Yahoo.Controls.Form.prototype.addControl = function(value) { //log("Form.addControl"); // NOTE: Overrides baseclass if(value!=null) { value.parent = this; this._controls.push(value); this._clientFrame.addSubview(value.frame); } // if(null) } /** * Adds an event handler. Supported events are: BorderColorChanged, Closing, Closed. * @param {Function} eventHandler The function that is to be called when the event is raised. * @param {String} eventName The name of the event that is being listened to. */ Yahoo.Controls.Form.prototype.addEventHandler = function(eventHandler, eventName) { // Call baseclass this.baseclassForm.addEventHandler.call(this, eventHandler, eventName) switch(eventName) { case "BorderColorChanged": this._onBorderColorChangedEventHandlers.push(eventHandler); break; case "Closing": this._onClosingEventHandlers.push(eventHandler); break; case "Closed": this._onClosedEventHandlers.push(eventHandler); break; } } /** * Closes the form. */ Yahoo.Controls.Form.prototype.close = function() { var cancelEventArgs = new Yahoo.EventArgs(); this._onClosing.call(this, this, cancelEventArgs); if(cancelEventArgs.cancel==false) { this.dispose(); this._onClosed.call(this, this, new Yahoo.EventArgs()); } } /** * Disposes control's resources. */ Yahoo.Controls.Form.prototype.dispose = function() { // Dispose native items this._form_disposeNativeObjects(); // Call base class, removes all native items from _frame, too this.baseclassForm.dispose.call(this); // Clean up other items if(this._clientFrame!=null) { this._clientFrame = null; } this._window.visible = false; // DEBUG: This will crash Widget Engine //this._window = null; } /** * Hides the control. */ Yahoo.Controls.Form.prototype.hide = function() { // NOTE: Overrides baseclass this._window.visible = false; } /** * Displays the control. */ Yahoo.Controls.Form.prototype.show = function() { // NOTE: Overrides baseclass if(this._window.opacity==0) { this._window.opacity = 255; } this._window.visible = true; } /*-----------------------------------------------------------*/ // Public properties /*-----------------------------------------------------------*/ /** * Gets or sets the form border color. * @type String */ Yahoo.Controls.Form.prototype.borderColor getter = function() { return this._borderColor; } Yahoo.Controls.Form.prototype.borderColor setter = function(value) { if(value!=this._bordercolor) { this._borderColor = value; this._onBorderColorChanged(this, new Yahoo.EventArgs()); } } /** * Gets or sets the height and width of the client area. * @type Yahoo.Drawing.Size */ Yahoo.Controls.Form.prototype.clientSize getter = function() { // NOTE: Overrides base class if(this._disposing==false) { return new Yahoo.Drawing.Size(this._clientFrame.width, this._clientFrame.height); } } Yahoo.Controls.Form.prototype.clientSize setter = function(value) { // NOTE: Overrides base class throw new Error("clientSize is read-only"); } /** * Gets or sets a value indicating whether the close button is displayed. * @type Boolean */ Yahoo.Controls.Form.prototype.closeBox getter = function() { return this._closeBox; } Yahoo.Controls.Form.prototype.closeBox setter = function(value) { if(this._closeBox!=value) { this._closeBox = value; this._form_paintBackground(); } } /** * Gets or sets the style of the form border. * @type Yahoo.Controls.FormBorderStyle */ Yahoo.Controls.Form.prototype.formBorderStyle getter = function() { return this._formBorderStyle; } Yahoo.Controls.Form.prototype.formBorderStyle setter = function(value) { // TODO: Check input for valid type / compare to enum this._formBorderStyle = value; // Tell form to update its style this._onFormBorderStyleChanged(this, new Yahoo.EventArgs()); } /** * Gets or sets the dialog result for the form. * @type Integer */ Yahoo.Controls.Form.prototype.dialogResult getter = function() { return this._dialogResult; } Yahoo.Controls.Form.prototype.dialogResult setter = function(value) { this._dialogResult = value; } /** * Gets the the frame of the control. * @type Frame */ Yahoo.Controls.Form.prototype.frame getter = function() { // NOTE: Overrides baseclass return this._clientFrame; } Yahoo.Controls.Form.prototype.frame setter = function(value) { // NOTE: Overrides baseclass throw new Error("frame is read-only"); } /** * Gets or sets the height of the control. * @type Integer */ Yahoo.Controls.Form.prototype.height getter = function() { // NOTE: Overrides baseclass if(this._disposing==false) { return this._window.height; } } Yahoo.Controls.Form.prototype.height setter = function(value) { // NOTE: Overrides baseclass if(value!=null) { if(this._window.height != value) { this._form_setSize(this._window.width, value); } } else { throw new Yahoo.ArgumentNullException("value"); } } /** * Gets or sets the x-coordinate of the left edge of this control. * @type Integer */ Yahoo.Controls.Form.prototype.left getter = function() { // NOTE: Overrides baseclass if(this._disposing==false) { return this._window.hOffset; } } Yahoo.Controls.Form.prototype.left setter = function(value) { // NOTE: Overrides baseclass if(value!=null) { this._form_setLocation(value, this.top); } else { throw new Yahoo.ArgumentNullException("value"); } } /** * Gets or sets the form maximum height. * @type Integer */ Yahoo.Controls.Form.prototype.maximumHeight getter = function() { return this._maximumHeight; } Yahoo.Controls.Form.prototype.maximumHeight setter = function(value) { this._maximumHeight = value; // Make sure the form size is within bounds if(this.height > value) { this.height = value; } } /** * Gets or sets the form maximum size. * @type Yahoo.Drawing.Size */ Yahoo.Controls.Form.prototype.maximumSize getter = function() { return new Yahoo.Drawing.Size(this._maximumWidth, this._maximumHeight); } Yahoo.Controls.Form.prototype.maximumSize setter = function(value) { this._maximumWidth = value.width; this._maximumHeight = value.height; // Make sure the form size is within bounds if(this.width > value.width || this.height > value.height) { // Check which value we need to modify (the logic is a little reversed) if(this.width < value.width) { value.width = this.width; } if(this.height < value.height) { value.height = this.height; } this._form_setSize(value.width, value.height); } } /** * Gets or sets the form maximum width. * @type Integer */ Yahoo.Controls.Form.prototype.maximumWidth getter = function() { return this._maximumWidth; } Yahoo.Controls.Form.prototype.maximumWidth setter = function(value) { this._maximumWidth = value; // Make sure the form size is within bounds if(this.width > value) { this.width = value; } } /** * Gets or sets the form minimum height. * @type Integer */ Yahoo.Controls.Form.prototype.minimumHeight getter = function() { return this._minimumHeight; } Yahoo.Controls.Form.prototype.minimumHeight setter = function(value) { this._minimumHeight = value; // Make sure the form size is within bounds if(this.height < value) { this.height = value; } } /** * Gets or sets the form minimum size. * @type Yahoo.Drawing.Size */ Yahoo.Controls.Form.prototype.minimumSize getter = function() { return new Yahoo.Drawing.Size(this._minimumWidth, this._minimumHeight); } Yahoo.Controls.Form.prototype.minimumSize setter = function(value) { this._minimumWidth = value.width; this._minimumHeight = value.height; // Make sure the form size is within bounds if(this.width < value.width || this.height < value.height) { // Check which size we need to modify if(this.width > value.width) { value.width = this.width; } if(this.height > value.height) { value.height = this.height; } this._form_setSize(value.width, value.height); } } /** * Gets or sets the form minimum width. * @type Integer */ Yahoo.Controls.Form.prototype.minimumWidth getter = function() { return this._minimumWidth; } Yahoo.Controls.Form.prototype.minimumWidth setter = function(value) { this._minimumWidth = value; // Make sure the form size is within bounds if(this.width <= value) { this.width = value; } } /** * Gets or sets the y-coordinate of the top edge of this control. * @type Integer */ Yahoo.Controls.Form.prototype.top getter = function() { // NOTE: Overrides baseclass if(this._disposing==false) { return this._window.vOffset; } } Yahoo.Controls.Form.prototype.top setter = function(value) { // NOTE: Overrides baseclass if(value!=null) { this._form_setLocation(this.left, value); } else { throw new Yahoo.ArgumentNullException("value"); } } /** * Gets or sets the width of the control. * @type Integer */ Yahoo.Controls.Form.prototype.width getter = function() { // NOTE: Overrides baseclass if(this._disposing==false) { return this._window.width; } } Yahoo.Controls.Form.prototype.width setter = function(value) { // NOTE: Overrides baseclass if(value!=null) { if(this._window.width != value) { this._form_setSize(value, this._window.height); } } else { throw new Yahoo.ArgumentNullException("value"); } } /** * Gets the Window of this form. * @type Window */ Yahoo.Controls.Form.prototype.window getter = function() { if(this._disposing==false) { return this._frame.window; } } Yahoo.Controls.Form.prototype.window setter = function(value) { throw new Error("window is read-only"); } ((*/*---------------------------------------------------------------------*/ /// /// (C) Copyright 2005-2006 Yahoo! Inc. All Rights Reserved. /// /** * ImageButton control. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Constructor /*---------------------------------------------------------------------*/ /** * Default constructor. * @constructor * @param {Yahoo.Controls.Theme} theme The theme this control should use or null to create an instance of the default theme. * param {Image} normal The image to use in the rest state. * param {Image} over The image to use in the mouse over state. * param {Image} down The image to use in the mouse down state. * param {Image} disabled The image to use in the disabled state. */ Yahoo.Controls.ImageButton = function(theme, normal, over, down, disabled) { //log("ImageButton.ctor()"); if(arguments.length>0) { this.initialize(theme, normal, over, down, disabled); } } /** * Define inheritance chain. */ Yahoo.Controls.ImageButton.prototype = new Yahoo.Controls.Control(); Yahoo.Controls.ImageButton.prototype.constructor = Yahoo.Controls.ImageButton; Yahoo.Controls.ImageButton.prototype.baseclassImageButton = Yahoo.Controls.Control.prototype; /*-----------------------------------------------------------*/ // Control code /*-----------------------------------------------------------*/ /** * Raises the onEnabledChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ImageButton.prototype._onEnabledChanged = function(sender, e) { //log("ImageButton._onEnabledChanged"); // Call baseclass this.baseclassImageButton._onEnabledChanged.call(this, sender, e); this._imageButton_setButtonState(); } /** * Raises the onToolTipChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ImageButton.prototype._onToolTipChanged = function(sender, e) { //log("ImageButton._onToolTipChanged"); // Call baseclass this.baseclassImageButton._onToolTipChanged.call(this, sender, e); // Set tooltip this._imgDisabled.tooltip = this.toolTip; this._imgDown.tooltip = this.toolTip; this._imgNormal.tooltip = this.toolTip; this._imgOver.tooltip = this.toolTip; } /** * Handles onEnter event for whole control. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ImageButton.prototype._onEnter = function(sender, e) { //log("ImageButton._onEnter"); // Call baseclass this.baseclassImageButton._onEnter.call(this, sender, e); this._imageButton_setButtonState(); } /** * Handles onLeave event for whole control. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ImageButton.prototype._onLeave = function(sender, e) { //log("ImageButton._onLeave"); // Call baseclass this.baseclassImageButton._onLeave.call(this, sender, e); this._imageButton_setButtonState(); } /** * Handles onMouseDown event for whole control. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ImageButton.prototype._imageButton_onMouseDown = function(sender, e) { //log("ImageButton._imageButton_onMouseDown"); sender._imageButton_setButtonState(); } /** * Handles onMouseUp event for whole control. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ImageButton.prototype._imageButton_onMouseUp = function(sender, e) { //log("ImageButton._imageButton_onMouseUp"); sender._imageButton_setButtonState(); } /** * Raises the onResize event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ImageButton.prototype._onResize = function(sender, e) { //log("ImageButton._onResize"); // Call baseclass this.baseclassImageButton._onResize.call(this, sender, e); var width = this.width; var height = this.height; // Resize images this._imgDisabled.width = width; this._imgDisabled.height = height; this._imgDown.width = width; this._imgDown.height = height; this._imgNormal.width = width; this._imgNormal.height = height; this._imgOver.width = width; this._imgOver.height = height; } /** * Handles the onThemeChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ImageButton.prototype._onThemeChanged = function(sender, e) { //log("Button._onThemeChanged"); // Call base class this.baseclassImageButton._onThemeChanged.call(this, sender, e); this._imageButton_loadTheme(); } /*---------------------------------------------------------------------*/ // Private code /*---------------------------------------------------------------------*/ /** * Disposes native Widget Engine objects. * @private */ Yahoo.Controls.ImageButton.prototype._imageButton_disposeNativeObjects = function() { //log("ImageButton._imageButton_disposeNativeObjects"); if(this._imgDisabled!=null) { this._imgDisabled.removeFromSuperview(); this._imgDisabled = null; } if(this._imgDown!=null) { this._imgDown.removeFromSuperview(); this._imgDown = null; } if(this._imgNormal!=null) { this._imgNormal.removeFromSuperview(); this._imgNormal = null; } if(this._imgOver!=null) { this._imgOver.removeFromSuperview(); this._imgOver = null; } } /** * Loads control elements based on current theme. * @private */ Yahoo.Controls.ImageButton.prototype._imageButton_loadTheme = function() { // Load images this._imgDisabled = this._imageButton_getButton(this._disabledItem); this._imgDown = this._imageButton_getButton(this._downItem); this._imgNormal = this._imageButton_getButton(this._normalItem); this._imgOver = this._imageButton_getButton(this._overItem); this._imageButton_setButtonState(); } /** * Sets the button state. * @private */ Yahoo.Controls.ImageButton.prototype._imageButton_setButtonState = function() { if(this.disposing==false) { // Hide all buttons this._imgDisabled.visible = false; this._imgDown.visible = false; this._imgNormal.visible = false; this._imgOver.visible = false; if(this.enabled==false) { this._imgDisabled.visible = true; } else { if(this._isMouseOver==true && this._isMouseDown==true) { this._imgDown.visible = true; } else if(this._isMouseOver==true && this._isMouseDown==false) { this._imgOver.visible = true; } else { this._imgNormal.visible = true; } } // if enabled } // if disposing } /** * Loads an image from the theme. * @private * @param {String} itemName The style name to retrieve. * @type Image */ Yahoo.Controls.ImageButton.prototype._imageButton_getButton = function(itemName) { var result; result = this._theme.getItem(itemName); result.visible = false; result.tooltip = this.toolTip; result.tag = this; this._frame.addSubview(result); return result; } /*---------------------------------------------------------------------*/ // Public code /*---------------------------------------------------------------------*/ /** * True constructor. Must be called if this class is overridden. * @param {Yahoo.Controls.Theme} theme The theme this control should use or null to create an instance of the default theme. * param {Image} normal The image to use in the rest state. * param {Image} over The image to use in the mouse over state. * param {Image} down The image to use in the mouse down state. * param {Image} disabled The image to use in the disabled state. */ Yahoo.Controls.ImageButton.prototype.initialize = function(theme, normal, over, down, disabled) { //log("ImageButton.initialize()"); // Call base class constructor this.baseclassImageButton.initialize.call(this, theme); this._normalItem = normal; this._overItem = over; this._downItem = down; this._disabledItem = disabled; // Hook into mouse events for whole control this.addEventHandler(this._imageButton_onMouseDown, "MouseDown"); this.addEventHandler(this._imageButton_onMouseUp, "MouseUp"); this._imageButton_loadTheme(); } /** * Disposes control's resources. */ Yahoo.Controls.ImageButton.prototype.dispose = function() { this._imageButton_disposeNativeObjects(); // Call base class this.baseclassImageButton.dispose.call(this); } /*---------------------------------------------------------------------*/ // Public properties /*---------------------------------------------------------------------*/ /** * Gets or sets the height of the control. * @type Integer */ Yahoo.Controls.ImageButton.prototype.height getter = function() { var result; // NOTE: Overrides baseclass if(this._frame.height!=-1) { result = this._frame.height; } else { result = this._imgNormal.height; } return result; } Yahoo.Controls.ImageButton.prototype.height setter = function(value) { if(value!=null) { this._control_setSize(this.width, value); } else { throw new Yahoo.ArgumentNullException("value"); } } /** * Gets or sets the width of the control. * @type Integer */ Yahoo.Controls.ImageButton.prototype.width getter = function() { var result; // NOTE: Overrides baseclass if(this._frame.width!=-1) { result = this._frame.width; } else { result = this._imgNormal.width; } return result; } Yahoo.Controls.ImageButton.prototype.width setter = function(value) { if(value!=null) { this._control_setSize(value, this.height); } else { throw new Yahoo.ArgumentNullException("value"); } } )@ @Sqk/*---------------------------------------------------------------------*/ /// /// (C) Copyright 2006 Yahoo! Inc. All Rights Reserved. /// /** * ImageComboBox control. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Constructor /*---------------------------------------------------------------------*/ /** * Default constructor. * @constructor * @param {Yahoo.Controls.Theme} theme The theme this control should use or null to create an instance of the default theme. * @param {String} themePrefix The prefix used to retrieve styles from the theme for this control. */ Yahoo.Controls.ImageComboBox = function(theme, themePrefix) { //log("ImageComboBox.ctor()"); if(arguments.length>0) { this.initialize(theme, themePrefix); } } /** * Define inheritance chain. */ Yahoo.Controls.ImageComboBox.prototype = new Yahoo.Controls.Control(); Yahoo.Controls.ImageComboBox.prototype.constructor = Yahoo.Controls.ImageComboBox; Yahoo.Controls.ImageComboBox.prototype.baseclassImageComboBox = Yahoo.Controls.Control.prototype; /*-----------------------------------------------------------*/ // Control code /*-----------------------------------------------------------*/ /** * Raises the onEnabledChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ImageComboBox.prototype._onEnabledChanged = function(sender, e) { //log("ImageComboBox._onEnabledChanged"); // Call baseclass this.baseclassImageComboBox._onEnabledChanged.call(this, sender, e); this._btnDropDown.enabled = this.enabled; } /** * Raises the onToolTipChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ImageComboBox.prototype._onToolTipChanged = function(sender, e) { //log("ImageComboBox._onToolTipChanged"); // Call baseclass this.baseclassImageComboBox._onToolTipChanged.call(this, sender, e); // Set tooltip this._btnDropDown.toolTip = this.toolTip; } /** * Raises the onSelectedIndexChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ImageComboBox.prototype._onSelectedIndexChanged = function(sender, e) { //log("ImageComboBox._onSelectedIndexChanged"); if(this._selectedIndex!=-1) { this._text = this._items.item(this._selectedIndex).toString(); } else { this._text = ""; } // Raise event Yahoo.raiseEvent(sender, sender._onSelectedIndexChangedEventHandlers, e); } /** * Raises the onThemeChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ImageComboBox.prototype._onThemeChanged = function(sender, e) { //log("ImageComboBox._onThemeChanged"); // Call base class this.baseclassImageComboBox._onThemeChanged.call(this, sender, e); this._imageComboBox_loadTheme(); } /** * Handles onMouseEnter event for image. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ImageComboBox.prototype._imageComboBox_btnDropDown_onEnter = function(sender, e) { //log("ImageComboBox._imageComboBox_btnDropDown_onEnter"); sender.parent._onEnter.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } /** * Handles onMouseExit event for imagebutton. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ImageComboBox.prototype._imageComboBox_btnDropDown_onLeave = function(sender, e) { //log("ImageComboBox._imageComboBox_btnDropDown_onLeave"); // Don't forward this if we are still within the parent control if(sender.parent.displayRectangle.contains(system.event.x + sender.left + sender.parent.left, system.event.y + sender.top + sender.parent.top) == false) { sender.parent._onLeave.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } } /** * Handles onMouseDown event for imagebutton. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ImageComboBox.prototype._imageComboBox_btnDropDown_onMouseDown = function(sender, e) { //log("ImageComboBox._imageComboBox_btnDropDown_onMouseDown"); sender.parent._onMouseDown.call(sender.parent, sender.parent, new Yahoo.EventArgs()); // Opening the menu will mess with the buttons mouse state flags, reset them here sender.parent._btnDropDown._isMouseOver = false; sender.parent._btnDropDown._isMouseDown = false; sender.parent._btnDropDown._imageButton_setButtonState(); sender.parent._imageComboBox_showMenu.call(sender.parent); } /** * Handles onMouseUp event for imagebutton. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ImageComboBox.prototype._imageComboBox_btnDropDown_onMouseUp = function(sender, e) { //log("ImageComboBox._imageComboBox_btnDropDown_onMouseUp"); sender.parent._onMouseUp.call(sender.parent, sender.parent, new Yahoo.EventArgs()); } /** * Handles click event for comboitem. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ImageComboBox.prototype._imageComboBox_item_onClick = function() { //log("ComboBox._imageComboBox_item_onClick"); this.tag.selectedIndex = this.index; } /*---------------------------------------------------------------------*/ // Private code /*---------------------------------------------------------------------*/ /** * Disposes native Widget Engine objects. * @private */ Yahoo.Controls.ImageComboBox.prototype._imageComboBox_disposeNativeObjects = function() { //log("ImageComboBox._imageComboBox_disposeNativeObjects"); // These aren't native objects, but we still dispose them here if(this._btnDropDown!=null) { this._btnDropDown.dispose(); this._btnDropDown = null; } } /** * Loads control elements based on current theme. * @private */ Yahoo.Controls.ImageComboBox.prototype._imageComboBox_loadTheme = function() { // Remove any current objects this._imageComboBox_disposeNativeObjects(); this._btnDropDown = new Yahoo.Controls.ImageButton(this._theme, this._themePrefix + "Normal", this._themePrefix + "Over", this._themePrefix + "Down", this._themePrefix + "Disabled"); this._btnDropDown.addEventHandler(this._imageComboBox_btnDropDown_onEnter, "Enter"); this._btnDropDown.addEventHandler(this._imageComboBox_btnDropDown_onLeave, "Leave"); this._btnDropDown.addEventHandler(this._imageComboBox_btnDropDown_onMouseDown, "MouseDown"); this._btnDropDown.addEventHandler(this._imageComboBox_btnDropDown_onMouseUp, "MouseUp"); this._btnDropDown.zOrder = 5; this.addControl(this._btnDropDown); } /** * Displays menu. * @private */ Yahoo.Controls.ImageComboBox.prototype._imageComboBox_showMenu = function() { var count; var menu = new Array(); var point; for(count=0; count0) { point = this.pointToClient(new Yahoo.Drawing.Point(0, this.height)); popupMenu(menu, point.x, point.y); } } /*---------------------------------------------------------------------*/ // Public code /*---------------------------------------------------------------------*/ /** * True constructor. Must be called if this class is overridden. * @param {Yahoo.Controls.Theme} theme The theme this control should use or null to create an instance of the default theme. * @param {String} themePrefix The prefix used to retrieve styles from the theme for this control. */ Yahoo.Controls.ImageComboBox.prototype.initialize = function(theme, themePrefix) { //log("ImageComboBox.initialize()"); // Call baseclass constructor this.baseclassImageComboBox.initialize.call(this, theme, "comboBox"); this._themePrefix = themePrefix; this._showCheckmark = true; // Includes handled by baseclass //lib.include("Yahoo.ArgumentNullException"); //lib.include("Yahoo.ArgumentOutOfRangeException"); //lib.include("Yahoo.Controls.Theme"); //lib.include("Yahoo.Drawing.Rectangle"); // Includes lib.include("Yahoo.Controls.ImageButton"); // Initialize variables/controls this._items = new Yahoo.Controls.ImageComboBox.ObjectCollection(); this._selectedIndex = -1 this._onSelectedIndexChangedEventHandlers = new Array(); this._imageComboBox_loadTheme(); } /** * Adds an event handler. Supported events are: SelectedIndexChanged. * @param {Function} eventHandler The function that is to be called when the event is raised. * @param {String} eventName The name of the event that is being listened to. */ Yahoo.Controls.ImageComboBox.prototype.addEventHandler = function(eventHandler, eventName) { // Call baseclass this.baseclassImageComboBox.addEventHandler.call(this, eventHandler, eventName) switch(eventName) { case "SelectedIndexChanged": this._onSelectedIndexChangedEventHandlers.push(eventHandler); break; } } /** * Disposes control's resources. */ Yahoo.Controls.ImageComboBox.prototype.dispose = function() { this._imageComboBox_disposeNativeObjects(); // Call baseclass this.baseclassImageComboBox.dispose.call(this); // Baseclass disposes our custom controls } /*---------------------------------------------------------------------*/ // Public properties /*---------------------------------------------------------------------*/ /** * Gets the collection of items in the combobox. * @type Yahoo.Controls.ImageComboBox.ObjectCollection */ Yahoo.Controls.ImageComboBox.prototype.items getter = function() { return this._items; } Yahoo.Controls.ImageComboBox.prototype.items setter = function(value) { throw new Error("items is read-only"); } /** * Gets or sets the selected item index. * @type Integer */ Yahoo.Controls.ImageComboBox.prototype.selectedIndex getter = function() { return this._selectedIndex; } Yahoo.Controls.ImageComboBox.prototype.selectedIndex setter = function(value) { if(value!=null) { if(this._selectedIndex!=value) { if(value<-1 || value>=this._items.count) { throw new Yahoo.ArgumentOutOfRangeException("value"); } else { this._selectedIndex = value; this._onSelectedIndexChanged(this, new Yahoo.EventArgs()); } } } else { throw new Yahoo.ArgumentNullException("value"); } } /** * Gets or sets a value indicating whether the selected item will have a checkmark. * @type Boolean */ Yahoo.Controls.ImageComboBox.prototype.showCheckmark getter = function() { return this._showCheckmark; } Yahoo.Controls.ImageComboBox.prototype.showCheckmark setter = function(value) { if(value!=null) { this._showCheckmark = value; } else { throw new Yahoo.ArgumentNullException("value"); } } /*---------------------------------------------------------------------*/ /// /// (C) Copyright 2005-2006 Yahoo! Inc. All Rights Reserved. /// /** * ImageComboBoxCollection control. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Namespace /*---------------------------------------------------------------------*/ // Create namespace Yahoo.Controls if it doesn't already exist if(Yahoo==undefined) { var Yahoo = new Object(); } if(Yahoo.Windows==undefined) { Yahoo.Windows = new Object(); } if(Yahoo.Controls==undefined) { Yahoo.Controls = new Object(); } /*---------------------------------------------------------------------*/ // Constructor /*---------------------------------------------------------------------*/ /** * Default constructor. */ Yahoo.Controls.ImageComboBox.ObjectCollection = function() { //log("ImageComboBox.ObjectCollection.ctor()"); this.initialize(); } /*---------------------------------------------------------------------*/ // Private code /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Public code /*---------------------------------------------------------------------*/ /** * True constructor. Must be called if this class is overridden. */ Yahoo.Controls.ImageComboBox.ObjectCollection.prototype.initialize = function() { //log("ImageComboBox.ObjectCollection.initialize()"); this._items = new Array(); } /** * Adds an item to the collection. * @param {Object} item The item to add to the collection. */ Yahoo.Controls.ImageComboBox.ObjectCollection.prototype.add = function(item) { var result = -1; if(item!=null) { result = this._items.push(item) - 1; } else { throw new Yahoo.ArgumentNullException("item"); } return result; } /** * Removes all items from the collection. */ Yahoo.Controls.ImageComboBox.ObjectCollection.prototype.clear = function() { delete this._items; this._items = new Array(); } /** * Gets the index of the given item. * @param {Object} item The item to to find in the collection. */ Yahoo.Controls.ImageComboBox.ObjectCollection.prototype.indexOf = function(item) { var count; var result = -1; if(item!=null) { // Find the item for(count=0; count=0 && index=0 && index /// (C) Copyright 2005-2006 Yahoo! Inc. All Rights Reserved. /// /** * Label control. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Constructor /*---------------------------------------------------------------------*/ /** * Default constructor. * @constructor * @param {Yahoo.Controls.Theme} theme The theme this control should use or null to create an instance of the default theme. */ Yahoo.Controls.Label = function(theme) { //log("Label.ctor()"); if(arguments.length>0) { this.initialize(theme); } } /** * Define inheritance chain. */ Yahoo.Controls.Label.prototype = new Yahoo.Controls.Control(); Yahoo.Controls.Label.prototype.constructor = Yahoo.Controls.Label; Yahoo.Controls.Label.prototype.baseclassLabel = Yahoo.Controls.Control.prototype; /*-----------------------------------------------------------*/ // Control code /*-----------------------------------------------------------*/ /** * Raises the onFontChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Label.prototype._onFontChanged = function(sender, e) { //log("Label._onFontChanged"); // Call base class this.baseclassLabel._onFontChanged.call(this, sender, e); this._lblText.style.fontFamily = this.font.name; this._lblText.style.fontSize = this.font.size + "px"; this._label_setTextLocation(); } /** * Raises the onForeColorChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Label.prototype._onForeColorChanged = function(sender, e) { //log("Label._onForeColorChanged"); // Call base class this.baseclassLabel._onForeColorChanged.call(this, sender, e); this._lblText.color = this.foreColor; } /** * Raises the onResize event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Label.prototype._onResize = function(sender, e) { //log("Label._onResize"); // Call base class this.baseclassLabel._onResize.call(this, sender, e); // Resize text this._label_setTextLocation(); } /** * Raises the onTextChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Label.prototype._onTextChanged = function(sender, e) { //log("Label._onTextChanged"); // Call base class this.baseclassLabel._onTextChanged.call(this, sender, e); // Set text this._lblText.data = this.text; // Set/Update location this._label_setTextLocation(); } /** * Raises the onToolTipChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Label.prototype._onToolTipChanged = function(sender, e) { //log("Label._onToolTipChanged"); // Call base class this.baseclassLabel._onToolTipChanged.call(this, sender, e); // Set tooltip this._lblText.tooltip = this.toolTip; } /** * Raises the onThemeChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Label.prototype._onThemeChanged = function(sender, e) { log("Label._onThemeChanged"); // Call base class this.baseclassLabel._onThemeChanged.call(this, sender, e); this._label_loadTheme(); } /*---------------------------------------------------------------------*/ // Private code /*---------------------------------------------------------------------*/ /** * Disposes native Widget Engine objects. * @private */ Yahoo.Controls.Label.prototype._label_disposeNativeObjects = function() { //log("Label._label_disposeNativeObjects"); if(this._lblText!=null) { this._lblText.removeFromSuperview(); this._lblText = null; } } /** * Loads control elements based on current theme. * @private */ Yahoo.Controls.Label.prototype._label_loadTheme = function() { //log("_label_loadTheme"); // Remove any current objects this._label_disposeNativeObjects(); this._lblText = this._theme.getItem("labelLabel"); this._lblText.anchorStyle = "topLeft"; // Change tracking for label so we can use it to detect when the mouse is over the whole Label this._lblText.tracking = "rectangle"; this._frame.addSubview(this._lblText); this._lblText.data = this.text; this._label_setTextLocation(); } /** * Sets the hOffset for the text label. * @private */ Yahoo.Controls.Label.prototype._label_setTextLocation = function() { //log("Label._label_setTextLocation"); var width; var height; if(this._isInitializing==false) { width = this.width; height = this.height; if(this._autoSize==true) { this._lblText.width = -1; } else { this._lblText.width = width; } // This takes care of aligning the text in a way that is more familiar for programmers switch(this._textAlign) { // Do vertical alignment case Yahoo.Drawing.ContentAlignment.BottomCenter: case Yahoo.Drawing.ContentAlignment.BottomLeft: case Yahoo.Drawing.ContentAlignment.BottomRight: this._lblText.vOffset = (height - this._lblText.height); break; case Yahoo.Drawing.ContentAlignment.MiddleCenter: case Yahoo.Drawing.ContentAlignment.MiddleLeft: case Yahoo.Drawing.ContentAlignment.MiddleRight: this._lblText.vOffset = ((height / 2) - (this._lblText.height / 2)); break; case Yahoo.Drawing.ContentAlignment.TopCenter: case Yahoo.Drawing.ContentAlignment.TopLeft: case Yahoo.Drawing.ContentAlignment.TopRight: this._lblText.vOffset = 0; break; default: throw new Yahoo.InvalidEnumArgumentException(); break; } switch(this._textAlign) { // Do horizontal alignment case Yahoo.Drawing.ContentAlignment.BottomCenter: case Yahoo.Drawing.ContentAlignment.MiddleCenter: case Yahoo.Drawing.ContentAlignment.TopCenter: this._lblText.alignment = "center"; this._lblText.hOffset = width / 2; break; case Yahoo.Drawing.ContentAlignment.BottomLeft: case Yahoo.Drawing.ContentAlignment.MiddleLeft: case Yahoo.Drawing.ContentAlignment.TopLeft: this._lblText.alignment = "left"; this._lblText.hOffset = 0; break; case Yahoo.Drawing.ContentAlignment.BottomRight: case Yahoo.Drawing.ContentAlignment.MiddleRight: case Yahoo.Drawing.ContentAlignment.TopRight: this._lblText.alignment = "right"; this._lblText.hOffset = width; break; //default: //throw new Yahoo.InvalidEnumArgumentException(); //break; } } // isInitializing } /*---------------------------------------------------------------------*/ // Public code /*---------------------------------------------------------------------*/ /** * True constructor. Must be called if this class is overridden. * @param {Yahoo.Controls.Theme} theme The theme this control should use or null to create an instance of the default theme. */ Yahoo.Controls.Label.prototype.initialize = function(theme) { //log("Label.initialize()"); var params; // Call base class constructor this.baseclassLabel.initialize.call(this, theme); this._isInitializing = true; // Includes lib.include("Yahoo.InvalidEnumArgumentException"); lib.include("Yahoo.Drawing.ContentAlignment"); // Initialize variables (optimized version) this._autoSize = false; this._textAlign = Yahoo.Drawing.ContentAlignment.MiddleLeft; this._label_loadTheme(); this._isInitializing = false; } /** * Disposes control's resources. */ Yahoo.Controls.Label.prototype.dispose = function() { // Dispose native items this._label_disposeNativeObjects(); // Call base class this.baseclassLabel.dispose.call(this); } /** * Sets the label properties based on a Widget Engine Text-object. * @param {Text} text The Text object to set the label style from. */ Yahoo.Controls.Label.prototype.fromTextObject = function(text) { if(text!=null) { this._lblText.style.fontFamily = text.style.fontFamily; this._lblText.style.fontSize = text.style.fontSize; this._lblText.style.fontWeight = text.style.fontWeight; if(text.style.KonTextTruncation != "") { this._lblText.style.KonTextTruncation = text.style.KonTextTruncation; } this._backColor = text.bgColor; this._frame.style.backgroundColor = this._backColor; this._foreColor = text.color; this._lblText.color = this._foreColor; this._text = text.data; this._lblText.data = this.text; this.opacity = text.opacity; this._lblText.scrolling = text.scrolling; this._toolTip = text.tooltip; this._lblText.tooltip = this._toolTip; this.visible = text.visible; this.zOrder = text.zOrder; this._control_setSize(text.width, text.height) // This will call setLocation this.font = new Yahoo.Drawing.Font(text.font, text.size); } else { throw new Yahoo.ArgumentNullException("text"); } } /*---------------------------------------------------------------------*/ // Public properties /*---------------------------------------------------------------------*/ /** * Gets or sets a value indicating whether the label resizes to fit its contents. * @type Boolean */ Yahoo.Controls.Label.prototype.autoSize getter = function() { return this._autoSize; } Yahoo.Controls.Label.prototype.autoSize setter = function(value) { if(value!=null) { this._autoSize = value; this._label_setTextLocation(); } else { throw new Yahoo.ArgumentNullException("value"); } } /** * Gets or sets the alignment of the text on the Label. * @type Yahoo.Drawing.ContentAlignment */ Yahoo.Controls.Label.prototype.textAlign getter = function() { return this._textAlign; } Yahoo.Controls.Label.prototype.textAlign setter = function(value) { if(value!=null) { this._textAlign = value; this._label_setTextLocation(); } else { throw new Yahoo.ArgumentNullException("value"); } } /** * Gets or sets a value indicating whether the text should scroll if it does not fit. * @type Boolean */ Yahoo.Controls.Label.prototype.scrolling getter = function() { return this._lblText.scrolling; } Yahoo.Controls.Label.prototype.scrolling setter = function(value) { if(value!=null) { this._lblText.scrolling = value; } else { throw new Yahoo.ArgumentNullException("value"); } } /** * Gets the style object for this text label. * @type Style */ Yahoo.Controls.Label.prototype.style getter = function() { return this._lblText.style; } Yahoo.Controls.Label.prototype.style setter = function(value) { throw new Error("style is read-only"); } "AS/*---------------------------------------------------------------------*/ /// /// (C) Copyright 2005-2006 Yahoo! Inc. All Rights Reserved. /// /** * ProgressBar control. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Constructor /*---------------------------------------------------------------------*/ /** * Default constructor. * @constructor * @param {Yahoo.Controls.Theme} theme The theme this control should use or null to create an instance of the default theme. */ Yahoo.Controls.ProgressBar = function(theme) { //log("ProgressBar.ctor()"); if(arguments.length>0) { this.initialize(theme); } } /** * Define inheritance chain. */ Yahoo.Controls.ProgressBar.prototype = new Yahoo.Controls.SizableControlBase(); Yahoo.Controls.ProgressBar.prototype.constructor = Yahoo.Controls.ProgressBar; Yahoo.Controls.ProgressBar.prototype.baseclassProgressBar = Yahoo.Controls.SizableControlBase.prototype; /*-----------------------------------------------------------*/ // Control code /*-----------------------------------------------------------*/ /** * Raises the onResize event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ProgressBar.prototype._onResize = function(sender, e) { //log("ProgressBar._onResize"); // Call base class this.baseclassProgressBar._onResize.call(this, sender, e); // Resize fill image this._progressBar_setFillImageHeight(); this._progressBar_setFill(); } /** * Raises the onThemeChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.ProgressBar.prototype._onThemeChanged = function(sender, e) { //log("ProgressBar._onThemeChanged"); // Call base class this.baseclassProgressBar._onThemeChanged.call(this, sender, e); // TODO: //this._progressBar_loadTheme(); } /*---------------------------------------------------------------------*/ // Private code /*---------------------------------------------------------------------*/ /** * Sets the hOffset for the fill image. * @private */ Yahoo.Controls.ProgressBar.prototype._progressBar_setFillImageLeft = function() { if(this._imgFill!=null) { this._imgFill.hOffset = this._fillMarginLeft; } } /** * Sets the vOffset for the fill image. * @private */ Yahoo.Controls.ProgressBar.prototype._progressBar_setFillImageTop = function() { if(this._imgFill!=null) { this._imgFill.vOffset = this._fillMarginTop; } } /** * Sets the height for the fill image. * @private */ Yahoo.Controls.ProgressBar.prototype._progressBar_setFillImageHeight = function() { if(this._imgFill!=null) { this._imgFill.height = this.height - this._fillMarginTop - this._fillMarginBottom; } } /** * Sets the size of the fill image to match the current value. * @private */ Yahoo.Controls.ProgressBar.prototype._progressBar_setFill = function() { var width; if(this._imgFill!=null) { try { if(this._maximum!=0) { width = (this._value / this._maximum) * (this.width - this._fillMarginLeft - this._fillMarginRight); } else { width = 0; } if(isNaN(width)==false) { this._imgFill.width = Math.round(width); } } catch(e) { log(e); } } } /*---------------------------------------------------------------------*/ // Public code /*---------------------------------------------------------------------*/ /** * True constructor. Must be called if this class is overridden. * @param {Yahoo.Controls.Theme} theme The theme this control should use or null to create an instance of the default theme. */ Yahoo.Controls.ProgressBar.prototype.initialize = function(theme) { //log("ProgressBar.initialize()"); var params; // Call base class constructor this.baseclassProgressBar.initialize.call(this, theme, "progressBar"); // Initialize variables this._maximum = 0; this._minimum = 0; this._value = 0; this._imgFill = this._theme.getItem("progressBarFill"); this._frame.addSubview(this._imgFill); // Get margins for fill image from theme params = this._theme.getParameter("progressBarFillMargins"); this._fillMarginLeft = parseInt(params.left); this._fillMarginRight = parseInt(params.right); this._fillMarginTop = parseInt(params.top); this._fillMarginBottom = parseInt(params.bottom); this._progressBar_setFillImageLeft(); this._progressBar_setFillImageTop(); this._progressBar_setFillImageHeight(); this._progressBar_setFill(); } /** * Disposes control's resources. */ Yahoo.Controls.ProgressBar.prototype.dispose = function() { // Dispose native items // TODO: This should be moved elsewhere once we support changing themes on the fly if(this._imgFill!=null) { this._imgFill.removeFromSuperview(); this._imgFill = null; } // Call base class this.baseclassProgressBar.dispose.call(this); } /*---------------------------------------------------------------------*/ // Public properties /*---------------------------------------------------------------------*/ /** * Gets or sets the maximum value. * @type Integer */ Yahoo.Controls.ProgressBar.prototype.maximum getter = function() { return this._maximum; } Yahoo.Controls.ProgressBar.prototype.maximum setter = function(value) { if(value!=null) { this._maximum = value; } else { throw new Yahoo.ArgumentNullException("value"); } } /** * Gets or sets the minimimum value. * @type Integer */ Yahoo.Controls.ProgressBar.prototype.minimum getter = function() { return this._minimum; } Yahoo.Controls.ProgressBar.prototype.minimum setter = function(value) { if(value!=null) { this._minimum = value; } else { throw new Yahoo.ArgumentNullException("value"); } } /** * Gets or sets the current value. * @type Integer */ Yahoo.Controls.ProgressBar.prototype.value getter = function() { return this._value; } Yahoo.Controls.ProgressBar.prototype.value setter = function(value) { if(value!=null) { if((valuethis._maximum)) { throw new Yahoo.ArgumentOutOfRangeException("value"); } else { this._value = value; this._progressBar_setFill(); } } else { throw new Yahoo.ArgumentNullException("value"); } } ^w>*8/*---------------------------------------------------------------------*/ /// /// (C) Copyright 2005-2006 Yahoo! Inc. All Rights Reserved. /// /** * Three part sizable rectangular control base. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Constructor /*---------------------------------------------------------------------*/ /** * Default constructor. * @constructor * @param {Yahoo.Controls.Theme} theme The theme this control should use or null to create an instance of the default theme. * @param {String} themePrefix The prefix used to retrieve styles from the theme for this control. */ Yahoo.Controls.Sizable3PartControlBase = function(theme, themePrefix) { //log("Sizable3PartControlBase.ctor()"); if(arguments.length>0) { this.initialize(theme, themePrefix); } } /** * Define inheritance chain. */ Yahoo.Controls.Sizable3PartControlBase.prototype = new Yahoo.Controls.Control(); Yahoo.Controls.Sizable3PartControlBase.prototype.constructor = Yahoo.Controls.Sizable3PartControlBase; Yahoo.Controls.Sizable3PartControlBase.prototype.baseclassSizable3PartControlBase = Yahoo.Controls.Control.prototype; /*-----------------------------------------------------------*/ // Control code /*-----------------------------------------------------------*/ /** * Raises the onBackColorChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Sizable3PartControlBase.prototype._onBackColorChanged = function(sender, e) { //log("Sizable3PartControlBase._onBackColorChanged"); // Call base class this.baseclassSizable3PartControlBase._onBackColorChanged.call(this, sender, e); this._imgMiddle.colorize = this._backColor; } /** * Control's internal resize handler. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Sizable3PartControlBase.prototype._onResize = function(sender, e) { //log("Sizable3PartControlBase._onResize"); // sender = top level control that inherits from us // this = Sizable3PartControlBase // Call base class this.baseclassSizable3PartControlBase._onResize.call(this, sender, e); // Resize borders and background sender._Sizable3PartControlBase_paintBackground(); } /** * Raises the onThemeChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Sizable3PartControlBase.prototype._onThemeChanged = function(sender, e) { //log("Sizable3PartControlBase._onThemeChanged"); // Call base class this.baseclassSizable3PartControlBase._onThemeChanged.call(this, sender, e); this._Sizable3PartControlBase_loadTheme(); this._Sizable3PartControlBase_paintBackground(); } /** * Raises the onToolTipChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.Sizable3PartControlBase.prototype._onToolTipChanged = function(sender, e) { //log("Sizable3PartControlBase._onToolTipChanged"); // Call base class this.baseclassSizable3PartControlBase._onToolTipChanged.call(this, sender, e); // Set tooltip this._imgMiddle.tooltip = this.tooltip; this._imgLeft.tooltip = this.tooltip; this._imgRight.tooltip = this.tooltip; } /*-----------------------------------------------------------*/ // Private code /*-----------------------------------------------------------*/ /** * Disposes native Widget Engine objects. * @private */ Yahoo.Controls.Sizable3PartControlBase.prototype._Sizable3PartControlBase_disposeNativeObjects = function() { //log("Sizable3PartControlBase._Sizable3PartControlBase_disposeNativeObjects"); if(this._imgMiddle!=null) { this._imgMiddle.removeFromSuperview(); this._imgMiddle = null; } if(this._imgLeft!=null) { this._imgLeft.removeFromSuperview(); this._imgLeft = null; } if(this._imgRight!=null) { this._imgRight.removeFromSuperview(); this._imgRight = null; } } /** * Loads control elements based on current theme. * @private */ Yahoo.Controls.Sizable3PartControlBase.prototype._Sizable3PartControlBase_loadTheme = function() { //log("Sizable3PartControlBase._Sizable3PartControlBase_loadTheme"); // Remove any current objects this._Sizable3PartControlBase_disposeNativeObjects(); // Load objects using current theme this._imgMiddle = this._theme.getItem(this._themePrefix + "Middle"); this._imgMiddle.tag = this; this._frame.addSubview(this._imgMiddle); this._imgLeft = this._theme.getItem(this._themePrefix + "Left"); this._imgLeft.tag = this; this._frame.addSubview(this._imgLeft); this._imgRight = this._theme.getItem(this._themePrefix + "Right"); this._imgRight.tag = this; this._frame.addSubview(this._imgRight); } /** * Resizes control border elements. * @private */ Yahoo.Controls.Sizable3PartControlBase.prototype._Sizable3PartControlBase_paintBackground = function() { var width; var height; width = this.width; height = this.height; this._imgLeft.height = height; this._imgMiddle.hOffset = this._imgLeft.width; this._imgMiddle.width = width - (this._imgLeft.width + this._imgRight.width); this._imgMiddle.height = height; this._imgRight.hOffset = width - this._imgRight.width; this._imgRight.height = height; } /*-----------------------------------------------------------*/ // Public code /*-----------------------------------------------------------*/ /** * Initializes control. * @param {Yahoo.Controls.Theme} theme The theme this control should use or null to create an instance of the default theme. * @param {String} themePrefix The prefix used to retrieve styles from the theme for this control. */ Yahoo.Controls.Sizable3PartControlBase.prototype.initialize = function(theme, themePrefix) { //log("Sizable3PartControlBase.initialize()"); if(themePrefix==null) { throw new Yahoo.ArgumentNullException("themePrefix"); } // Call base class this.baseclassSizable3PartControlBase.initialize.call(this, theme); this._isInitializing = true; this._themePrefix = themePrefix; // Internal objects this._imgMiddle = null; this._imgLeft = null; this._imgRight = null; // Load image objects this._Sizable3PartControlBase_loadTheme(); // Set locations/sizes that do not change this._imgLeft.hOffset = 0; this._imgLeft.vOffset = 0; // Size from image this._imgMiddle.vOffset = 0; this._imgRight.vOffset = 0; // Size from image // We don't resize since we must be inherited //this._onResize(this, new Yahoo.EventArgs()); this._isInitializing = false; } /** * Disposes control's resources. */ Yahoo.Controls.Sizable3PartControlBase.prototype.dispose = function() { // Call base class this.baseclassSizable3PartControlBase.dispose.call(this); // Dispose native items this._Sizable3PartControlBase_disposeNativeObjects(); } /*-----------------------------------------------------------*/ // Public properties /*-----------------------------------------------------------*/ ,+-d/*---------------------------------------------------------------------*/ /// /// (C) Copyright 2005-2006 Yahoo! Inc. All Rights Reserved. /// /** * Sizable rectangular control base. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Constructor /*---------------------------------------------------------------------*/ /** * Default constructor. * @constructor * @param {Yahoo.Controls.Theme} theme The theme this control should use or null to create an instance of the default theme. */ Yahoo.Controls.SizableControlBase = function(theme, themePrefix) { //log("SizableControlBase.ctor()"); if(arguments.length>0) { this.initialize(theme, themePrefix); } } /** * Define inheritance chain. */ Yahoo.Controls.SizableControlBase.prototype = new Yahoo.Controls.Control(); Yahoo.Controls.SizableControlBase.prototype.constructor = Yahoo.Controls.SizableControlBase; Yahoo.Controls.SizableControlBase.prototype.baseclassSizableControlBase = Yahoo.Controls.Control.prototype; /*-----------------------------------------------------------*/ // Control code /*-----------------------------------------------------------*/ /** * Raises the onBackColorChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.SizableControlBase.prototype._onBackColorChanged = function(sender, e) { //log("SizableControlBase._onBackColorChanged"); // Call base class this.baseclassSizableControlBase._onBackColorChanged.call(this, sender, e); this._imgBackground.colorize = this._backColor; } /** * Control's internal resize handler. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.SizableControlBase.prototype._onResize = function(sender, e) { //log("SizableControlBase._onResize"); // sender = top level control that inherits from us // this = SizableControlBase // Call base class this.baseclassSizableControlBase._onResize.call(this, sender, e); // Resize borders and background sender._sizableControlBase_paintBackground(); } /** * Raises the onThemeChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.SizableControlBase.prototype._onThemeChanged = function(sender, e) { //log("SizableControlBase._onThemeChanged"); // Call base class this.baseclassSizableControlBase._onThemeChanged.call(this, sender, e); this._sizableControlBase_loadTheme(); this._sizableControlBase_paintBackground(); } /** * Raises the onToolTipChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.SizableControlBase.prototype._onToolTipChanged = function(sender, e) { //log("SizableControlBase._onToolTipChanged"); // Call base class this.baseclassSizableControlBase._onToolTipChanged.call(this, sender, e); // Set tooltip this._imgBackground.tooltip = this.tooltip; this._imgCornerTopLeft.tooltip = this.tooltip; this._imgCornerTopRight.tooltip = this.tooltip; this._imgCornerBottomLeft.tooltip = this.tooltip; this._imgCornerBottomRight.tooltip = this.tooltip; this._imgBorderTop.tooltip = this.tooltip; this._imgBorderBottom.tooltip = this.tooltip; this._imgBorderLeft.tooltip = this.tooltip; this._imgBorderRight.tooltip = this.tooltip; } /*-----------------------------------------------------------*/ // Private code /*-----------------------------------------------------------*/ /** * Disposes native Widget Engine objects. * @private */ Yahoo.Controls.SizableControlBase.prototype._sizableControlBase_disposeNativeObjects = function() { //log("SizableControlBase._sizableControlBase_disposeNativeObjects"); if(this._imgBackground!=null) { this._imgBackground.removeFromSuperview(); this._imgBackground = null; } if(this._imgCornerTopLeft!=null) { this._imgCornerTopLeft.removeFromSuperview(); this._imgCornerTopLeft = null; } if(this._imgCornerTopRight!=null) { this._imgCornerTopRight.removeFromSuperview(); this._imgCornerTopRight = null; } if(this._imgCornerBottomLeft!=null) { this._imgCornerBottomLeft.removeFromSuperview(); this._imgCornerBottomLeft = null; } if(this._imgCornerBottomRight!=null) { this._imgCornerBottomRight.removeFromSuperview(); this._imgCornerBottomRight = null; } if(this._imgBorderTop!=null) { this._imgBorderTop.removeFromSuperview(); this._imgBorderTop = null; } if(this._imgBorderBottom!=null) { this._imgBorderBottom.removeFromSuperview(); this._imgBorderBottom = null; } if(this._imgBorderLeft!=null) { this._imgBorderLeft.removeFromSuperview(); this._imgBorderLeft = null; } if(this._imgBorderRight!=null) { this._imgBorderRight.removeFromSuperview(); this._imgBorderRight = null; } } /** * Loads control elements based on current theme. * @private */ Yahoo.Controls.SizableControlBase.prototype._sizableControlBase_loadTheme = function() { //log("SizableControlBase._sizableControlBase_loadTheme"); // Remove any current objects this._sizableControlBase_disposeNativeObjects(); // Load objects using current theme this._imgBackground = this._theme.getItem(this._themePrefix + "Background"); this._imgBackground.tag = this; this._frame.addSubview(this._imgBackground); this._imgCornerTopLeft = this._theme.getItem(this._themePrefix + "CornerTopLeft"); this._imgCornerTopLeft.tag = this; this._frame.addSubview(this._imgCornerTopLeft); this._imgCornerTopRight = this._theme.getItem(this._themePrefix + "CornerTopRight"); this._imgCornerTopRight.tag = this; this._frame.addSubview(this._imgCornerTopRight); this._imgCornerBottomLeft = this._theme.getItem(this._themePrefix + "CornerBottomLeft"); this._imgCornerBottomLeft.tag = this; this._frame.addSubview(this._imgCornerBottomLeft); this._imgCornerBottomRight = this._theme.getItem(this._themePrefix + "CornerBottomRight"); this._imgCornerBottomRight.tag = this; this._frame.addSubview(this._imgCornerBottomRight); this._imgBorderTop = this._theme.getItem(this._themePrefix + "BorderTop"); this._imgBorderTop.tag = this; this._frame.addSubview(this._imgBorderTop); this._imgBorderBottom = this._theme.getItem(this._themePrefix + "BorderBottom"); this._imgBorderBottom.tag = this; this._frame.addSubview(this._imgBorderBottom); this._imgBorderLeft = this._theme.getItem(this._themePrefix + "BorderLeft"); this._imgBorderLeft.tag = this; this._frame.addSubview(this._imgBorderLeft); this._imgBorderRight = this._theme.getItem(this._themePrefix + "BorderRight"); this._imgBorderRight.tag = this; this._frame.addSubview(this._imgBorderRight); } /** * Resizes control border elements. * @private */ Yahoo.Controls.SizableControlBase.prototype._sizableControlBase_paintBackground = function() { var width; var height; width = this.width; height = this.height; this._imgCornerTopRight.hOffset = width - this._imgCornerTopRight.width; this._imgCornerBottomLeft.vOffset = height - this._imgCornerBottomLeft.height; this._imgCornerBottomRight.hOffset = width - this._imgCornerBottomRight.width; this._imgCornerBottomRight.vOffset = height - this._imgCornerBottomRight.height; // Size from image // Top border width is width - (corner widths) this._imgBorderTop.hOffset = this._imgCornerTopLeft.hOffset + this._imgCornerTopLeft.width; this._imgBorderTop.width = width - (this._imgCornerTopLeft.width + this._imgCornerTopRight.width); // Height from image // Left border height is height - (corner heights) this._imgBorderLeft.vOffset = this._imgCornerTopLeft.height; // Width from image this._imgBorderLeft.height = height - (this._imgCornerTopLeft.height + this._imgCornerBottomLeft.height); // Right border height is height - (corner heights) this._imgBorderRight.hOffset = width - this._imgBorderRight.width; this._imgBorderRight.vOffset = this._imgCornerTopRight.height; // Width from image this._imgBorderRight.height = height - (this._imgCornerTopRight.height + this._imgCornerBottomRight.height); // Bottom border width is width - (corner widths) this._imgBorderBottom.hOffset = this._imgCornerBottomLeft.hOffset + this._imgCornerBottomLeft.width; this._imgBorderBottom.vOffset = height - this._imgBorderBottom.height; this._imgBorderBottom.width = width - (this._imgCornerBottomLeft.width + this._imgCornerBottomRight.width); // Height from image this._imgBackground.hOffset = this._imgBorderLeft.width + this._imgBorderLeft.hOffset; this._imgBackground.vOffset = this._imgBorderTop.height + this._imgBorderTop.vOffset; this._imgBackground.width = width - (this._imgBorderLeft.width + this._imgBorderRight.width); this._imgBackground.height = height - (this._imgBorderTop.height + this._imgBorderBottom.height); } /*-----------------------------------------------------------*/ // Public code /*-----------------------------------------------------------*/ /** * Initializes control. * @param {Yahoo.Controls.Theme} theme The theme this control should use or null to create an instance of the default theme. */ Yahoo.Controls.SizableControlBase.prototype.initialize = function(theme, themePrefix) { //log("SizableControlBase.initialize()"); if(themePrefix==null) { throw new Yahoo.ArgumentNullException("themePrefix"); } // Call base class this.baseclassSizableControlBase.initialize.call(this, theme); this._isInitializing = true; this._themePrefix = themePrefix; // Internal objects this._imgBackground = null; this._imgCornerTopLeft = null; this._imgCornerTopRight = null; this._imgCornerBottomLeft = null; this._imgCornerBottomRight = null; this._imgBorderTop = null; this._imgBorderBottom = null; this._imgBorderLeft = null; this._imgBorderRight = null; // Load image objects this._sizableControlBase_loadTheme(); // Set locations/sizes that do not change this._imgCornerTopLeft.hOffset = 0; this._imgCornerTopLeft.vOffset = 0; // Size from image this._imgCornerTopRight.vOffset = 0; // Size from image this._imgCornerBottomLeft.hOffset = 0; // Size from image this._imgBorderTop.vOffset = 0; this._imgBorderLeft.hOffset = 0; // We don't resize since we must be inherited //this._onResize(this, new Yahoo.EventArgs()); this._isInitializing = false; } /** * Disposes control's resources. */ Yahoo.Controls.SizableControlBase.prototype.dispose = function() { // Call base class this.baseclassSizableControlBase.dispose.call(this); // Dispose native items this._sizableControlBase_disposeNativeObjects(); } /*-----------------------------------------------------------*/ // Public properties /*-----------------------------------------------------------*/ 44Ϙ*8/*---------------------------------------------------------------------*/ /// /// (C) Copyright 2005-2006 Yahoo! Inc. All Rights Reserved. /// /** * TextBox control. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Constructor /*---------------------------------------------------------------------*/ /** * Default constructor. * @constructor * @param {Yahoo.Controls.Theme} theme The theme this control should use or null to create an instance of the default theme. */ Yahoo.Controls.TextBox = function(theme) { //log("TextBox.ctor()"); if(arguments.length>0) { this.initialize(theme); } } /** * Define inheritance chain. */ Yahoo.Controls.TextBox.prototype = new Yahoo.Controls.SizableControlBase(); Yahoo.Controls.TextBox.prototype.constructor = Yahoo.Controls.TextBox; Yahoo.Controls.TextBox.prototype.baseclassTextBox = Yahoo.Controls.SizableControlBase.prototype; /*-----------------------------------------------------------*/ // Control code /*-----------------------------------------------------------*/ /** * Raises the onEnabledChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.TextBox.prototype._onEnabledChanged = function(sender, e) { //log("TextBox._onEnabledChanged"); // Call baseclass this.baseclassTextBox._onEnabledChanged.call(this, sender, e); this._textBox_setTextBoxState(); } /** * Raises the onFontChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.TextBox.prototype._onFontChanged = function(sender, e) { //log("TextBox._onFontChanged"); // Call baseclass this.baseclassTextBox._onFontChanged.call(this, sender, e); this._txtTextBox.font = this.font; } /** * Raises the onForeColorChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.TextBox.prototype._onForeColorChanged = function(sender, e) { //log("TextBox._onForeColorChanged"); // Call baseclass this.baseclassTextBox._onForeColorChanged.call(this, sender, e); this._txtTextBox.foreColor = this.foreColor; } /** * Raises the onKeyDown event. * @param {Object} sender The source of the event. * @param {Yahoo.KeyPressEventArgs} e The KeyPressEventArgs object that contains event details. */ Yahoo.Controls.TextBox.prototype._onKeyDown = function(sender, e) { //log("TextBox._onKeyDown"); Yahoo.raiseEvent(this, this._onKeyDownEventHandlers, e); } /** * Raises the onKeyUp event. * @param {Object} sender The source of the event. * @param {Yahoo.KeyPressEventArgs} e The KeyPressEventArgs object that contains event details. */ Yahoo.Controls.TextBox.prototype._onKeyUp = function(sender, e) { //log("TextBox._onKeyUp"); Yahoo.raiseEvent(this, this._onKeyUpEventHandlers, e); } /** * Raises the onKeyPress event. * @param {Object} sender The source of the event. * @param {Yahoo.KeyPressEventArgs} e The KeyPressEventArgs object that contains event details. */ Yahoo.Controls.TextBox.prototype._onKeyPress = function(sender, e) { //log("TextBox._onKeyPress"); Yahoo.raiseEvent(this, this._onKeyPressEventHandlers, e); } /** * Raises the onResize event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.TextBox.prototype._onResize = function(sender, e) { //log("TextBox._onResize"); // Call baseclass this.baseclassTextBox._onResize.call(this, sender, e); // Resize elements this._textBox_setTextLocation(); } /** * Raises the onTextChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.TextBox.prototype._onTextChanged = function(sender, e) { //log("TextBox._onTextChanged"); if(this._previousText != this.text) { this._previousText = this.text; this._txtTextBox.data = this._previousText; // Call baseclass this.baseclassTextBox._onTextChanged.call(this, sender, e); } } /** * Raises the onThemeChanged event. * @param {Object} sender The source of the event. * @param {Yahoo.EventArgs} e The EventArgs object that contains event details. */ Yahoo.Controls.TextBox.prototype._onThemeChanged = function(sender, e) { //log("TextBox._onThemeChanged"); // Call base class this.baseclassTextBox._onThemeChanged.call(this, sender, e); this._textBox_loadTheme(); } /** * Handles the onKeyDown event for the native TextArea control. */ Yahoo.Controls.TextBox.prototype._textBox_onKeyDown = function() { //log("TextBox._textBox_onKeyDown"); var e = this.tag._getKeyPressEventArgs(); this.tag._onKeyDown.call(this.tag, this.tag, e); } /** * Handles the onKeyUp event for the native TextArea control. */ Yahoo.Controls.TextBox.prototype._textBox_onKeyUp = function() { //log("TextBox._textBox_onKeyUp"); var e = this.tag._getKeyPressEventArgs(); this.tag._onKeyUp.call(this.tag, this.tag, e); this.tag.text = this.tag._txtTextBox.data; } /** * Handles the onKeyPress event for the native TextArea control. */ Yahoo.Controls.TextBox.prototype._textBox_onKeyPress = function() { //log("TextBox._textBox_onKeyPress"); var e = this.tag._getKeyPressEventArgs(); this.tag._onKeyPress.call(this.tag, this.tag, e); // Check if we should cancel the keystroke if(e.cancel == true) { this.rejectKeyPress(); // Check if the key was changed if(system.event.key != e.key) { this.replaceSelection(e.key); } } } /*---------------------------------------------------------------------*/ // Private code /*---------------------------------------------------------------------*/ /** * Disposes native Widget Engine objects. * @private */ Yahoo.Controls.TextBox.prototype._textBox_disposeNativeObjects = function() { //log("TextBox._textBox_disposeNativeObjects"); if(this._txtTextBox!=null) { this._txtTextBox.removeFromSuperview(); this._txtTextBox = null; } } /** * Loads control elements based on current theme. * @private */ Yahoo.Controls.TextBox.prototype._textBox_loadTheme = function() { var text = ""; if(this._txtTextBox != null) { text = this._txtTextBox.text; } // Remove any current objects this._textBox_disposeNativeObjects(); // Add native TextArea control this._txtTextBox = new TextArea(); this._txtTextBox.zOrder = 999; this._txtTextBox.lines = 1; this._txtTextBox.scrollbar = false; this._txtTextBox.tag = this; this._txtTextBox.onKeyDown = this._textBox_onKeyDown; this._txtTextBox.onKeyUp = this._textBox_onKeyUp; this._txtTextBox.onKeyPress = this._textBox_onKeyPress; this.frame.addSubview(this._txtTextBox); this._textMargins = this._theme.getParameter("textBoxTextMargins"); this._txtTextBox.text = text; this._textBox_setTextLocation(); this._textBox_setTextBoxState(); } /** * Sets the size and location of the native TextArea control. * @private */ Yahoo.Controls.TextBox.prototype._textBox_setTextLocation = function() { this._txtTextBox.hOffset = parseInt(this._textMargins.left); this._txtTextBox.vOffset = parseInt(this._textMargins.top); this._txtTextBox.width = this.width - (parseInt(this._textMargins.left) + parseInt(this._textMargins.right)); this._txtTextBox.height = this.height - (parseInt(this._textMargins.top) + parseInt(this._textMargins.bottom)); } /** * Sets the textbox state. * @private */ Yahoo.Controls.TextBox.prototype._textBox_setTextBoxState = function() { if(this.enabled==false) { this._txtTextBox.enabled = false; } else { this._txtTextBox.enabled = true; } // if enabled } /** * Returns a prefilled KeyPressEventArgs class. * @private */ Yahoo.Controls.TextBox.prototype._getKeyPressEventArgs = function() { var result = new Yahoo.Controls.KeyPressEventArgs(); result.key = system.event.key; result.keyString = system.event.keyString; result.modifiers = system.event.modifiers; return result; } /*---------------------------------------------------------------------*/ // Public code /*---------------------------------------------------------------------*/ /** * True constructor. Must be called if this class is overridden. * @param {Yahoo.Controls.Theme} theme The theme this control should use or null to create an instance of the default theme. */ Yahoo.Controls.TextBox.prototype.initialize = function(theme) { //log("TextBox.initialize()"); // Call baseclass constructor this.baseclassTextBox.initialize.call(this, theme, "textBox"); this._previousText = ""; // Initialize variables/controls this._onKeyDownEventHandlers = new Array(); this._onKeyUpEventHandlers = new Array(); this._onKeyPressEventHandlers = new Array(); this._onTextChangedEventHandlers = new Array(); this._textBox_loadTheme(); } /** * Adds an event handler. Supported events are: KeyDown, KeyUp, KeyPress. * @param {Function} eventHandler The function that is to be called when the event is raised. * @param {String} eventName The name of the event that is being listened to. */ Yahoo.Controls.TextBox.prototype.addEventHandler = function(eventHandler, eventName) { // Call baseclass this.baseclassTextBox.addEventHandler.call(this, eventHandler, eventName) switch(eventName) { case "KeyDown": this._onKeyDownEventHandlers.push(eventHandler); break; case "KeyUp": this._onKeyUpEventHandlers.push(eventHandler); break; case "KeyPress": this._onKeyPressEventHandlers.push(eventHandler); break; } } /** * Disposes control's resources. */ Yahoo.Controls.TextBox.prototype.dispose = function() { this._textBox_disposeNativeObjects(); // Call baseclass this.baseclassTextBox.dispose.call(this); // Baseclass disposes our custom controls } /** * Moves the keyboard focus to the textbox. */ Yahoo.Controls.TextBox.prototype.focus = function() { this._txtTextBox.focus(); } /*---------------------------------------------------------------------*/ /// /// (C) Copyright 2005-2006 Yahoo! Inc. All Rights Reserved. /// /** * KeyPressEventArgs class. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Constructor /*---------------------------------------------------------------------*/ /** * Default constructor. */ Yahoo.Controls.KeyPressEventArgs = function() { this.initialize(); } /** * Define inheritance chain. */ Yahoo.Controls.KeyPressEventArgs.prototype = new Yahoo.EventArgs(); Yahoo.Controls.KeyPressEventArgs.prototype.constructor = Yahoo.Controls.KeyPressEventArgs; Yahoo.Controls.KeyPressEventArgs.prototype.baseclassKeyPressEventArgs = Yahoo.EventArgs.prototype; /*---------------------------------------------------------------------*/ // Public code /*---------------------------------------------------------------------*/ /** * True constructor. Must be called if this class is overridden. */ Yahoo.Controls.KeyPressEventArgs.prototype.initialize = function() { //log("KeyPressEventArgs.initialize()"); // Call baseclass constructor this.baseclassKeyPressEventArgs.initialize.call(); this._key = ""; this._keyString = ""; this._modifiers = ""; } /** * Returns a string representation of this class. */ Yahoo.Controls.KeyPressEventArgs.prototype.toString = function() { return "{Cancel=" + this.cancel + ", key='" + this._key + "', keyString='" + this._keyString + "', modifiers=" + this._modifiers + "}"; } /*---------------------------------------------------------------------*/ // Public properties /*---------------------------------------------------------------------*/ /** * Gets or sets the key that was pressed. * @type String */ Yahoo.Controls.KeyPressEventArgs.prototype.key getter = function() { return this._key; } Yahoo.Controls.KeyPressEventArgs.prototype.key setter = function(value) { this._key = value; } /** * Gets or sets the name of the key that was pressed. * @type String */ Yahoo.Controls.KeyPressEventArgs.prototype.keyString getter = function() { return this._keyString; } Yahoo.Controls.KeyPressEventArgs.prototype.keyString setter = function(value) { this._keyString = value; } /** * Gets or sets the modifier keys that were pressed. * @type String */ Yahoo.Controls.KeyPressEventArgs.prototype.modifiers getter = function() { return this._modifiers; } Yahoo.Controls.KeyPressEventArgs.prototype.modifiers setter = function(value) { this._modifiers = value; } T(S-d/*---------------------------------------------------------------------*/ /// /// (C) Copyright 2005-2007 Yahoo! Inc. All Rights Reserved. /// /** * Theme class for local (non-shared) installation of the library. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Namespace /*---------------------------------------------------------------------*/ // Create namespace if it doesn't already exist if(Yahoo==undefined) { var Yahoo = new Object(); } if(Yahoo.Controls==undefined) { Yahoo.Controls = new Object(); } /*---------------------------------------------------------------------*/ // Constructor /*---------------------------------------------------------------------*/ /** * Default constructor. * @constructor * @param {String} themePath The path to the theme folder. */ Yahoo.Controls.Theme = function(themePath) { if(arguments.length > 0) { this.initialize(themePath); } //arguments.length > 0 } /*---------------------------------------------------------------------*/ // Private code /*---------------------------------------------------------------------*/ /** * Loads themes from given widgetPath into internal array. * @private */ Yahoo.Controls.Theme.prototype._theme_getThemes = function() { var contents; var count; this._themes = new Array(); // HACK: Hard coded values for flat file support this._themes.push("Black Glass"); this._themes.push("FreeTime"); } /** * Returns a Widget Engine Image object based on given theme style. * @private * @param {DOMNode} itemNode The item node in the theme definition. Styles from this will override styleNode definitions. * @param {DOMNode} styleNode The item node in the theme definition. * @type Image */ Yahoo.Controls.Theme.prototype._theme_getImageObject = function(itemNode, styleNode) { var src; var result; if(itemNode!=null && styleNode!=null) { result = new Image(); // Required properties from style src = styleNode.getAttribute("src"); if(src!="") { if(src.substring(1,7)=="http://") { result.src = src } // If have URL else { // Have a filename, prefix with themes folder path result.src = this._themePath + "/" + this.themeName + "/" + src; } // If have URL } else { throw new Error("Missing src on style '" + styleNode.getAttribute("id") + "'"); } // Set attributes from style this._theme_setImageAttributes(result, styleNode); // Override attributes from item, if any this._theme_setImageAttributes(result, itemNode); } else { throw new Error("Missing itemNode or styleNode."); } return result; } /** * Returns a Widget Engine Text object based on given theme style. * @private * @param {DOMNode} itemNode The item node in the theme definition. Styles from this will override styleNode definitions. * @param {DOMNode} styleNode The item node in the theme definition. * @type Text */ Yahoo.Controls.Theme.prototype._theme_getLabelObject = function(itemNode, styleNode) { var result; if(itemNode!=null && styleNode!=null) { result = new Text(); // Set attributes from style this._theme_setLabelAttributes(result, styleNode); // Override attributes from item, if any this._theme_setLabelAttributes(result, itemNode); } else { throw new Error("Missing itemNode or styleNode."); } return result; } /** * Returns a Widget Engine TextArea object based on given theme style. * @private * @param {DOMNode} itemNode The item node in the theme definition. Styles from this will override styleNode definitions. * @param {DOMNode} styleNode The item node in the theme definition. * @type TextArea */ Yahoo.Controls.Theme.prototype._theme_getTextBoxObject = function(itemNode, styleNode) { var result; if(itemNode!=null && styleNode!=null) { result = new TextArea(); // Set attributes from style this._theme_setTextBoxAttributes(result, styleNode); // Override attributes from item, if any this._theme_setTextBoxAttributes(result, itemNode); } else { throw new Error("Missing itemNode or styleNode."); } return result; } /** * Sets label (Text) attributes from given node. * @private * @param {Text} label Text object which will be modified. * @param {DOMNode} node The style node used to set properties. */ Yahoo.Controls.Theme.prototype._theme_setLabelAttributes = function(label, node) { if(node.getAttribute("alignment") != "") { label.alignment = node.getAttribute("alignment"); } if(node.getAttribute("background-color") != "") { label.style.backgroundColor = node.getAttribute("background-color"); } if(node.getAttribute("bgColor") != "") { label.bgColor = node.getAttribute("bgColor"); } if(node.getAttribute("bgOpacity") != "") { label.bgOpacity = node.getAttribute("bgOpacity"); } if(node.getAttribute("color") != "") { label.color = node.getAttribute("color"); } if(node.getAttribute("data") != "") { label.data = node.getAttribute("data"); } if(node.getAttribute("font") != "") { label.font = node.getAttribute("font"); } if(node.getAttribute("font-family") != "") { label.style.fontFamily = node.getAttribute("font-family"); } if(node.getAttribute("font-size") != "") { label.style.fontSize = node.getAttribute("font-size"); } if(node.getAttribute("font-weight") != "") { label.style.fontWeight = node.getAttribute("font-weight"); } if(node.getAttribute("hAlign") != "") { label.hAlign = node.getAttribute("hAlign"); } if(node.getAttribute("height") != "") { label.height = node.getAttribute("height"); } if(node.getAttribute("hOffset") != "") { label.hOffset = node.getAttribute("hOffset"); } if(node.getAttribute("opacity") != "") { label.opacity = node.getAttribute("opacity"); } if(node.getAttribute("scrolling") != "") { label.scrolling = node.getAttribute("scrolling"); } if(node.getAttribute("size") != "") { label.size = node.getAttribute("size"); } if(node.getAttribute("tooltip") != "") { label.tooltip = node.getAttribute("tooltip"); } if(node.getAttribute("visible") != "") { if(node.getAttribute("visible")=="true") { label.visible = true; } else { label.visible = false; } } if(node.getAttribute("vOffset") != "") { label.vOffset = node.getAttribute("vOffset"); } if(node.getAttribute("width") != "") { label.width = node.getAttribute("width"); } if(node.getAttribute("kon-text-truncation") != "") { label.style.KonTextTruncation = node.getAttribute("kon-text-truncation"); } if(node.getAttribute("zOrder") != "") { label.zOrder = node.getAttribute("zOrder"); } } /** * Sets textBox (TextArea) attributes from given node. * @private * @param {TextArea} textBox TextArea object which will be modified. * @param {DOMNode} node The style node used to set properties. */ Yahoo.Controls.Theme.prototype._theme_setTextBoxAttributes = function(textBox, node) { if(node.getAttribute("alignment") != "") { textBox.alignment = node.getAttribute("alignment"); } if(node.getAttribute("background-color") != "") { textBox.style.backgroundColor = node.getAttribute("background-color"); } if(node.getAttribute("bgColor") != "") { textBox.bgColor = node.getAttribute("bgColor"); } if(node.getAttribute("bgOpacity") != "") { textBox.bgOpacity = node.getAttribute("bgOpacity"); } if(node.getAttribute("color") != "") { textBox.color = node.getAttribute("color"); } if(node.getAttribute("columns") != "") { textBox.columns = node.getAttribute("columns"); } if(node.getAttribute("data") != "") { textBox.data = node.getAttribute("data"); } if(node.getAttribute("editable") != "") { if(node.getAttribute("editable")=="true") { textBox.editable = true; } else { textBox.editable = false; } } if(node.getAttribute("font") != "") { textBox.font = node.getAttribute("font"); } if(node.getAttribute("font-family") != "") { textBox.style.fontFamily = node.getAttribute("font-family"); } if(node.getAttribute("font-size") != "") { textBox.style.fontSize = node.getAttribute("font-size"); } if(node.getAttribute("font-weight") != "") { textBox.style.fontWeight = node.getAttribute("font-weight"); } if(node.getAttribute("hAlign") != "") { textBox.hAlign = node.getAttribute("hAlign"); } if(node.getAttribute("height") != "") { textBox.height = node.getAttribute("height"); } if(node.getAttribute("hOffset") != "") { textBox.hOffset = node.getAttribute("hOffset"); } if(node.getAttribute("opacity") != "") { textBox.opacity = node.getAttribute("opacity"); } if(node.getAttribute("scrollbar") != "") { if(node.getAttribute("scrollbar")=="true") { textBox.scrollbar = true; } else { textBox.scrollbar = false; } } if(node.getAttribute("secure") != "") { if(node.getAttribute("secure")=="true") { textBox.secure = true; } else { textBox.secure = false; } } if(node.getAttribute("size") != "") { textBox.size = node.getAttribute("size"); } if(node.getAttribute("spellcheck") != "") { if(node.getAttribute("spellcheck")=="true") { textBox.spellcheck = true; } else { textBox.spellcheck = false; } } if(node.getAttribute("thumbColor") != "") { textBox.thumbColor = node.getAttribute("thumbColor"); } if(node.getAttribute("tooltip") != "") { textBox.tooltip = node.getAttribute("tooltip"); } if(node.getAttribute("visible") != "") { if(node.getAttribute("visible")=="true") { textBox.visible = true; } else { textBox.visible = false; } } if(node.getAttribute("vAlign") != "") { textBox.vAlign = node.getAttribute("vAlign"); } if(node.getAttribute("vOffset") != "") { textBox.vOffset = node.getAttribute("vOffset"); } if(node.getAttribute("width") != "") { textBox.width = node.getAttribute("width"); } if(node.getAttribute("zOrder") != "") { textBox.zOrder = node.getAttribute("zOrder"); } } /** * Sets image attributes from given node. * @private * @param {Image} image Image object which will be modified. * @param {DOMNode} node The style node used to set properties. */ Yahoo.Controls.Theme.prototype._theme_setImageAttributes = function(image, node) { if(node.getAttribute("colorize") != "") { image.colorize = node.getAttribute("colorize"); } if(node.getAttribute("fillMode") != "") { image.fillMode = node.getAttribute("fillMode"); } if(node.getAttribute("height") != "") { image.height = node.getAttribute("height"); } if(node.getAttribute("hOffset") != "") { image.hOffset = node.getAttribute("hOffset"); } if(node.getAttribute("hRegistrationPoint") != "") { image.hRegistrationPoint = node.getAttribute("hRegistrationPoint"); } if(node.getAttribute("hslAdjustment") != "") { image.hslAdjustment = node.getAttribute("hslAdjustment"); } if(node.getAttribute("hslTinting") != "") { image.hslTinting = node.getAttribute("hslTinting"); } if(node.getAttribute("opacity") != "") { image.opacity = node.getAttribute("opacity"); } if(node.getAttribute("rotation") != "") { image.rotation = node.getAttribute("rotation"); } if(node.getAttribute("tileOrigin") != "") { image.tileOrigin = node.getAttribute("tileOrigin"); } if(node.getAttribute("tooltip") != "") { image.tooltip = node.getAttribute("tooltip"); } if(node.getAttribute("tracking") != "") { image.tracking = node.getAttribute("tracking"); } if(node.getAttribute("visible") != "") { if(node.getAttribute("visible")=="true") { image.visible = true; } else { image.visible = false; } } if(node.getAttribute("vOffset") != "") { image.vOffset = node.getAttribute("vOffset"); } if(node.getAttribute("vRegistrationPoint") != "") { image.vRegistrationPoint = node.getAttribute("vRegistrationPoint"); } if(node.getAttribute("width") != "") { image.width = node.getAttribute("width"); } if(node.getAttribute("zOrder") != "") { image.zOrder = node.getAttribute("zOrder"); } } /** * Adds an item to the cache. * @private * @param {Object} item Object to add to the cache. * @param {String} itemName The item name of this object. It is used as the key in the cache. * @param {String} type The type name of the object. */ Yahoo.Controls.Theme.prototype._theme_addToCache = function(item, itemName, type) { var prop; var result = new Object(); result.style = new Object(); //log("Theme._theme_addToCache"); result.___cacheType = type; for(prop in item) { if((item[prop]!="" && item[prop]!=null)) { switch(prop.toLowerCase()) { case "colour": case "columns": case "id": case "lines": case "name": case "window": case "srcheight": case "srcwidth": case "superview": break; case "style": if(item.style!=null) { for(style in item.style) { if((item.style[style]!="" && item.style[style]!=null)) { result.style[style] = item.style[style]; } } } break; default: result[prop] = item[prop]; break; } // switch } // if value != null } // for prop this._cache[itemName] = result; } /** * Gets an item from the cache. * @private * @param {String} itemName The item name of the object to retrieve. * @type Object */ Yahoo.Controls.Theme.prototype._theme_getFromCache = function(itemName) { var prop; var propItem; var result; //log("Theme._theme_getFromCache"); propItem = this._cache[itemName]; if(propItem!=null) { //log("** Got item from cache"); switch(propItem.___cacheType) { case "image": result = new Image(); break; case "label": result = new Text(); break; case "textBox": result = new TextArea(); break; } //log("getting from cache"); if(result!=null) { // Copy properties from cached item for(prop in propItem) { switch(prop.toLowerCase()) { case "___cachetype": break; case "style": for(style in propItem.style) { result.style[style] = propItem.style[style]; } break; default: try { //log(prop + "=" + propItem[prop]); result[prop] = propItem[prop]; } catch(e) { log(e); } break; } // switch } } // if result!=null } // if propItem!=null return result; } /*---------------------------------------------------------------------*/ // Public code /*---------------------------------------------------------------------*/ /** * Initializes component. * @param {string} themePath The path to the theme folder. */ Yahoo.Controls.Theme.prototype.initialize = function(themePath) { // Includes lib.include("Yahoo.ArgumentNullException"); lib.include("Yahoo.EventArgs"); // Events this._onThemeChangedEventHandlers = new Array(); if(themePath!="") { // Private variables this._themePath = themePath; this._themes = null; this._themeName = null; this._themeDoc = null; // Load available themes this._theme_getThemes(); } // themePath = "" else { throw new Yahoo.ArgumentNullException("themePath"); } // themePath = "" } /** * Adds an event handler. Supported events are: ThemeChanged. * @param {Function} eventHandler The function that is to be called when the event is raised. * @param {String} eventName The name of the event that is being listened to. */ Yahoo.Controls.Theme.prototype.addEventHandler = function(eventHandler, eventName) { // Validate input if(eventHandler==null) { throw new Yahoo.ArgumentNullException("eventHandler"); return; } if(eventName==null) { throw new Yahoo.ArgumentNullException("eventName"); return; } switch(eventName) { case "ThemeChanged": this._onThemeChangedEventHandlers.push(eventHandler); break; default: throw new Error("Invalid eventName."); break; } } /** * Loads the given theme. * @param {String} themeName The name of the theme to load. */ Yahoo.Controls.Theme.prototype.loadTheme = function(themeName) { var file; this._themeName = themeName; try { // Clear cache for(item in this._cache) { this._cache[item] = null; } this._cache = null; // Load the file var myfilepath = widget.extractFile(this._themePath + "/" + this._themeName + "/" + this._themeName + ".xml"); file = filesystem.readFile(myfilepath); print("file" + this._themePath + "/" + this._themeName + "/" + this._themeName + ".xml"); this._themeDoc = XMLDOM.parse(file); this._cache = new Object(); } catch(e) { this._themeName = null; this._themeDoc = null; throw new Error("Invalid Theme Path"); } // Raise event Yahoo.raiseEvent(this, this._onThemeChangedEventHandlers, new Yahoo.EventArgs()); } /** * Returns the given GUI element based on the currently loaded theme. * @param {String} itemName The item name to retrieve. * @param {Window} window The window object to add the returned item to or null. * @type Object */ Yahoo.Controls.Theme.prototype.getItem = function(itemName, window) { var nodes; var styleName; var styleNode; var itemNode; var result; if(this._themeDoc!=null) { result = this._theme_getFromCache(itemName) if(result==null) { // Find the element that describe the GUI item requested nodes = this._themeDoc.evaluate("/theme/items/" + itemName); print("nodes" + nodes); if(nodes.length==1) { itemNode = nodes.item(0); // Get the style definition for the item styleName = itemNode.getAttribute("style"); nodes = this._themeDoc.evaluate("/theme/styles/*[@id='" + styleName + "']"); if(nodes.length==1) { styleNode = nodes.item(0); if(styleNode!=null) { // Get the style and create a Widget Engine object populated with correct properties switch(styleNode.nodeName) { case "image": result = this._theme_getImageObject(itemNode, styleNode); this._theme_addToCache(result, itemName, "image"); break; case "label": result = this._theme_getLabelObject(itemNode, styleNode); this._theme_addToCache(result, itemName, "label"); break; case "textBox": result = this._theme_getTextBoxObject(itemNode, styleNode); this._theme_addToCache(result, itemName, "textBox"); break; } // switch } else { throw new Error("Theme error: Style '" + styleName + "' not found for element '" + itemName + "'."); } //node!=null } else { throw new Error("Theme error: Incorrect number of styles of the type '" + styleName + "' (" + nodes.length + ")."); } // nodes.length==1 (styles) } else { //theme.loadTheme(preferences.colorPref.value); throw new Error("Theme error: Incorrect number of elements of the type '" + itemName + "' (" + nodes.length + ")."); } // nodes.length==1 (items) } // result == null (from cache) } else { throw new Error("Theme not loaded."); } if(window!=null) { result.window = window; } return result; } /** * Returns the parameter as an object based on the currently loaded theme. * @param {String} itemName The parameter item name to retrieve. */ Yahoo.Controls.Theme.prototype.getParameter = function(itemName) { var nodes; var itemNode; var itemAttrib; var attribCount; var result; if(this._themeDoc!=null) { // Find the element that describe the GUI item requested nodes = this._themeDoc.evaluate("/theme/parameters/" + itemName); if(nodes.length==1) { itemNode = nodes.item(0); // Create new object result = new Object(); result["itemName"] = itemNode.nodeName; // Loop all attributes in this element for(attribCount=0; attribCount /// (C) Copyright 2005-2007 Yahoo! Inc. All Rights Reserved. /// /** * Theme class for local (non-shared) installation of the library. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Namespace /*---------------------------------------------------------------------*/ // Create namespace if it doesn't already exist if(Yahoo==undefined) { var Yahoo = new Object(); } if(Yahoo.Controls==undefined) { Yahoo.Controls = new Object(); } /*---------------------------------------------------------------------*/ // Constructor /*---------------------------------------------------------------------*/ /** * Default constructor. * @constructor * @param {String} themePath The path to the theme folder. */ Yahoo.Controls.Theme = function(themePath) { if(arguments.length > 0) { this.initialize(themePath); } //arguments.length > 0 } /*---------------------------------------------------------------------*/ // Private code /*---------------------------------------------------------------------*/ /** * Loads themes from given widgetPath into internal array. * @private */ Yahoo.Controls.Theme.prototype._theme_getThemes = function() { var contents; var count; this._themes = new Array(); // HACK: Hard coded values for flat file support this._themes.push("Purple"); this._themes.push("Black Glass"); } /** * Returns a Widget Engine Image object based on given theme style. * @private * @param {DOMNode} itemNode The item node in the theme definition. Styles from this will override styleNode definitions. * @param {DOMNode} styleNode The item node in the theme definition. * @type Image */ Yahoo.Controls.Theme.prototype._theme_getImageObject = function(itemNode, styleNode) { var src; var result; if(itemNode!=null && styleNode!=null) { result = new Image(); // Required properties from style src = styleNode.getAttribute("src"); if(src!="") { if(src.substring(1,7)=="http://") { result.src = src } // If have URL else { // Have a filename, prefix with themes folder path result.src = this._themePath + "/" + this.themeName + "/" + src; } // If have URL } else { throw new Error("Missing src on style '" + styleNode.getAttribute("id") + "'"); } // Set attributes from style this._theme_setImageAttributes(result, styleNode); // Override attributes from item, if any this._theme_setImageAttributes(result, itemNode); } else { throw new Error("Missing itemNode or styleNode."); } return result; } /** * Returns a Widget Engine Text object based on given theme style. * @private * @param {DOMNode} itemNode The item node in the theme definition. Styles from this will override styleNode definitions. * @param {DOMNode} styleNode The item node in the theme definition. * @type Text */ Yahoo.Controls.Theme.prototype._theme_getLabelObject = function(itemNode, styleNode) { var result; if(itemNode!=null && styleNode!=null) { result = new Text(); // Set attributes from style this._theme_setLabelAttributes(result, styleNode); // Override attributes from item, if any this._theme_setLabelAttributes(result, itemNode); } else { throw new Error("Missing itemNode or styleNode."); } return result; } /** * Returns a Widget Engine TextArea object based on given theme style. * @private * @param {DOMNode} itemNode The item node in the theme definition. Styles from this will override styleNode definitions. * @param {DOMNode} styleNode The item node in the theme definition. * @type TextArea */ Yahoo.Controls.Theme.prototype._theme_getTextBoxObject = function(itemNode, styleNode) { var result; if(itemNode!=null && styleNode!=null) { result = new TextArea(); // Set attributes from style this._theme_setTextBoxAttributes(result, styleNode); // Override attributes from item, if any this._theme_setTextBoxAttributes(result, itemNode); } else { throw new Error("Missing itemNode or styleNode."); } return result; } /** * Sets label (Text) attributes from given node. * @private * @param {Text} label Text object which will be modified. * @param {DOMNode} node The style node used to set properties. */ Yahoo.Controls.Theme.prototype._theme_setLabelAttributes = function(label, node) { if(node.getAttribute("alignment") != "") { label.alignment = node.getAttribute("alignment"); } if(node.getAttribute("background-color") != "") { label.style.backgroundColor = node.getAttribute("background-color"); } if(node.getAttribute("bgColor") != "") { label.bgColor = node.getAttribute("bgColor"); } if(node.getAttribute("bgOpacity") != "") { label.bgOpacity = node.getAttribute("bgOpacity"); } if(node.getAttribute("color") != "") { label.color = node.getAttribute("color"); } if(node.getAttribute("data") != "") { label.data = node.getAttribute("data"); } if(node.getAttribute("font") != "") { label.font = node.getAttribute("font"); } if(node.getAttribute("font-family") != "") { label.style.fontFamily = node.getAttribute("font-family"); } if(node.getAttribute("font-size") != "") { label.style.fontSize = node.getAttribute("font-size"); } if(node.getAttribute("font-weight") != "") { label.style.fontWeight = node.getAttribute("font-weight"); } if(node.getAttribute("hAlign") != "") { label.hAlign = node.getAttribute("hAlign"); } if(node.getAttribute("height") != "") { label.height = node.getAttribute("height"); } if(node.getAttribute("hOffset") != "") { label.hOffset = node.getAttribute("hOffset"); } if(node.getAttribute("opacity") != "") { label.opacity = node.getAttribute("opacity"); } if(node.getAttribute("scrolling") != "") { label.scrolling = node.getAttribute("scrolling"); } if(node.getAttribute("size") != "") { label.size = node.getAttribute("size"); } if(node.getAttribute("tooltip") != "") { label.tooltip = node.getAttribute("tooltip"); } if(node.getAttribute("visible") != "") { if(node.getAttribute("visible")=="true") { label.visible = true; } else { label.visible = false; } } if(node.getAttribute("vOffset") != "") { label.vOffset = node.getAttribute("vOffset"); } if(node.getAttribute("width") != "") { label.width = node.getAttribute("width"); } if(node.getAttribute("kon-text-truncation") != "") { label.style.KonTextTruncation = node.getAttribute("kon-text-truncation"); } if(node.getAttribute("zOrder") != "") { label.zOrder = node.getAttribute("zOrder"); } } /** * Sets textBox (TextArea) attributes from given node. * @private * @param {TextArea} textBox TextArea object which will be modified. * @param {DOMNode} node The style node used to set properties. */ Yahoo.Controls.Theme.prototype._theme_setTextBoxAttributes = function(textBox, node) { if(node.getAttribute("alignment") != "") { textBox.alignment = node.getAttribute("alignment"); } if(node.getAttribute("background-color") != "") { textBox.style.backgroundColor = node.getAttribute("background-color"); } if(node.getAttribute("bgColor") != "") { textBox.bgColor = node.getAttribute("bgColor"); } if(node.getAttribute("bgOpacity") != "") { textBox.bgOpacity = node.getAttribute("bgOpacity"); } if(node.getAttribute("color") != "") { textBox.color = node.getAttribute("color"); } if(node.getAttribute("columns") != "") { textBox.columns = node.getAttribute("columns"); } if(node.getAttribute("data") != "") { textBox.data = node.getAttribute("data"); } if(node.getAttribute("editable") != "") { if(node.getAttribute("editable")=="true") { textBox.editable = true; } else { textBox.editable = false; } } if(node.getAttribute("font") != "") { textBox.font = node.getAttribute("font"); } if(node.getAttribute("font-family") != "") { textBox.style.fontFamily = node.getAttribute("font-family"); } if(node.getAttribute("font-size") != "") { textBox.style.fontSize = node.getAttribute("font-size"); } if(node.getAttribute("font-weight") != "") { textBox.style.fontWeight = node.getAttribute("font-weight"); } if(node.getAttribute("hAlign") != "") { textBox.hAlign = node.getAttribute("hAlign"); } if(node.getAttribute("height") != "") { textBox.height = node.getAttribute("height"); } if(node.getAttribute("hOffset") != "") { textBox.hOffset = node.getAttribute("hOffset"); } if(node.getAttribute("opacity") != "") { textBox.opacity = node.getAttribute("opacity"); } if(node.getAttribute("scrollbar") != "") { if(node.getAttribute("scrollbar")=="true") { textBox.scrollbar = true; } else { textBox.scrollbar = false; } } if(node.getAttribute("secure") != "") { if(node.getAttribute("secure")=="true") { textBox.secure = true; } else { textBox.secure = false; } } if(node.getAttribute("size") != "") { textBox.size = node.getAttribute("size"); } if(node.getAttribute("spellcheck") != "") { if(node.getAttribute("spellcheck")=="true") { textBox.spellcheck = true; } else { textBox.spellcheck = false; } } if(node.getAttribute("thumbColor") != "") { textBox.thumbColor = node.getAttribute("thumbColor"); } if(node.getAttribute("tooltip") != "") { textBox.tooltip = node.getAttribute("tooltip"); } if(node.getAttribute("visible") != "") { if(node.getAttribute("visible")=="true") { textBox.visible = true; } else { textBox.visible = false; } } if(node.getAttribute("vAlign") != "") { textBox.vAlign = node.getAttribute("vAlign"); } if(node.getAttribute("vOffset") != "") { textBox.vOffset = node.getAttribute("vOffset"); } if(node.getAttribute("width") != "") { textBox.width = node.getAttribute("width"); } if(node.getAttribute("zOrder") != "") { textBox.zOrder = node.getAttribute("zOrder"); } } /** * Sets image attributes from given node. * @private * @param {Image} image Image object which will be modified. * @param {DOMNode} node The style node used to set properties. */ Yahoo.Controls.Theme.prototype._theme_setImageAttributes = function(image, node) { if(node.getAttribute("colorize") != "") { image.colorize = node.getAttribute("colorize"); } if(node.getAttribute("fillMode") != "") { image.fillMode = node.getAttribute("fillMode"); } if(node.getAttribute("height") != "") { image.height = node.getAttribute("height"); } if(node.getAttribute("hOffset") != "") { image.hOffset = node.getAttribute("hOffset"); } if(node.getAttribute("hRegistrationPoint") != "") { image.hRegistrationPoint = node.getAttribute("hRegistrationPoint"); } if(node.getAttribute("hslAdjustment") != "") { image.hslAdjustment = node.getAttribute("hslAdjustment"); } if(node.getAttribute("hslTinting") != "") { image.hslTinting = node.getAttribute("hslTinting"); } if(node.getAttribute("opacity") != "") { image.opacity = node.getAttribute("opacity"); } if(node.getAttribute("rotation") != "") { image.rotation = node.getAttribute("rotation"); } if(node.getAttribute("tileOrigin") != "") { image.tileOrigin = node.getAttribute("tileOrigin"); } if(node.getAttribute("tooltip") != "") { image.tooltip = node.getAttribute("tooltip"); } if(node.getAttribute("tracking") != "") { image.tracking = node.getAttribute("tracking"); } if(node.getAttribute("visible") != "") { if(node.getAttribute("visible")=="true") { image.visible = true; } else { image.visible = false; } } if(node.getAttribute("vOffset") != "") { image.vOffset = node.getAttribute("vOffset"); } if(node.getAttribute("vRegistrationPoint") != "") { image.vRegistrationPoint = node.getAttribute("vRegistrationPoint"); } if(node.getAttribute("width") != "") { image.width = node.getAttribute("width"); } if(node.getAttribute("zOrder") != "") { image.zOrder = node.getAttribute("zOrder"); } } /** * Adds an item to the cache. * @private * @param {Object} item Object to add to the cache. * @param {String} itemName The item name of this object. It is used as the key in the cache. * @param {String} type The type name of the object. */ Yahoo.Controls.Theme.prototype._theme_addToCache = function(item, itemName, type) { var prop; var result = new Object(); result.style = new Object(); //log("Theme._theme_addToCache"); result.___cacheType = type; for(prop in item) { if((item[prop]!="" && item[prop]!=null)) { switch(prop.toLowerCase()) { case "colour": case "columns": case "id": case "lines": case "name": case "window": case "srcheight": case "srcwidth": case "superview": break; case "style": if(item.style!=null) { for(style in item.style) { if((item.style[style]!="" && item.style[style]!=null)) { result.style[style] = item.style[style]; } } } break; default: result[prop] = item[prop]; break; } // switch } // if value != null } // for prop this._cache[itemName] = result; } /** * Gets an item from the cache. * @private * @param {String} itemName The item name of the object to retrieve. * @type Object */ Yahoo.Controls.Theme.prototype._theme_getFromCache = function(itemName) { var prop; var propItem; var result; //log("Theme._theme_getFromCache"); propItem = this._cache[itemName]; if(propItem!=null) { //log("** Got item from cache"); switch(propItem.___cacheType) { case "image": result = new Image(); break; case "label": result = new Text(); break; case "textBox": result = new TextArea(); break; } //log("getting from cache"); if(result!=null) { // Copy properties from cached item for(prop in propItem) { switch(prop.toLowerCase()) { case "___cachetype": break; case "style": for(style in propItem.style) { result.style[style] = propItem.style[style]; } break; default: try { //log(prop + "=" + propItem[prop]); result[prop] = propItem[prop]; } catch(e) { log(e); } break; } // switch } } // if result!=null } // if propItem!=null return result; } /*---------------------------------------------------------------------*/ // Public code /*---------------------------------------------------------------------*/ /** * Initializes component. * @param {string} themePath The path to the theme folder. */ Yahoo.Controls.Theme.prototype.initialize = function(themePath) { // Includes lib.include("Yahoo.ArgumentNullException"); lib.include("Yahoo.EventArgs"); // Events this._onThemeChangedEventHandlers = new Array(); if(themePath!="") { // Private variables this._themePath = themePath; this._themes = null; this._themeName = null; this._themeDoc = null; // Load available themes this._theme_getThemes(); } // themePath = "" else { throw new Yahoo.ArgumentNullException("themePath"); } // themePath = "" } /** * Adds an event handler. Supported events are: ThemeChanged. * @param {Function} eventHandler The function that is to be called when the event is raised. * @param {String} eventName The name of the event that is being listened to. */ Yahoo.Controls.Theme.prototype.addEventHandler = function(eventHandler, eventName) { // Validate input if(eventHandler==null) { throw new Yahoo.ArgumentNullException("eventHandler"); return; } if(eventName==null) { throw new Yahoo.ArgumentNullException("eventName"); return; } switch(eventName) { case "ThemeChanged": this._onThemeChangedEventHandlers.push(eventHandler); break; default: throw new Error("Invalid eventName."); break; } } /** * Loads the given theme. * @param {String} themeName The name of the theme to load. */ Yahoo.Controls.Theme.prototype.loadTheme = function(themeName) { var file; this._themeName = themeName; try { // Clear cache for(item in this._cache) { this._cache[item] = null; } this._cache = null; // Load the file file = filesystem.readFile(this._themePath + "/" + this._themeName + "/" + this._themeName + ".xml"); this._themeDoc = XMLDOM.parse(file); this._cache = new Object(); } catch(e) { this._themeName = null; this._themeDoc = null; } // Raise event Yahoo.raiseEvent(this, this._onThemeChangedEventHandlers, new Yahoo.EventArgs()); } /** * Returns the given GUI element based on the currently loaded theme. * @param {String} itemName The item name to retrieve. * @param {Window} window The window object to add the returned item to or null. * @type Object */ Yahoo.Controls.Theme.prototype.getItem = function(itemName, window) { var nodes; var styleName; var styleNode; var itemNode; var result; if(this._themeDoc!=null) { result = this._theme_getFromCache(itemName) if(result==null) { // Find the element that describe the GUI item requested nodes = this._themeDoc.evaluate("/theme/items/" + itemName); if(nodes.length==1) { itemNode = nodes.item(0); // Get the style definition for the item styleName = itemNode.getAttribute("style"); nodes = this._themeDoc.evaluate("/theme/styles/*[@id='" + styleName + "']"); if(nodes.length==1) { styleNode = nodes.item(0); if(styleNode!=null) { // Get the style and create a Widget Engine object populated with correct properties switch(styleNode.nodeName) { case "image": result = this._theme_getImageObject(itemNode, styleNode); this._theme_addToCache(result, itemName, "image"); break; case "label": result = this._theme_getLabelObject(itemNode, styleNode); this._theme_addToCache(result, itemName, "label"); break; case "textBox": result = this._theme_getTextBoxObject(itemNode, styleNode); this._theme_addToCache(result, itemName, "textBox"); break; } // switch } else { throw new Error("Theme error: Style '" + styleName + "' not found for element '" + itemName + "'."); } //node!=null } else { throw new Error("Theme error: Incorrect number of styles of the type '" + styleName + "' (" + nodes.length + ")."); } // nodes.length==1 (styles) } else { throw new Error("Theme error: Incorrect number of elements of the type '" + itemName + "' (" + nodes.length + ")."); } // nodes.length==1 (items) } // result == null (from cache) } else { throw new Error("Theme not loaded."); } if(window!=null) { result.window = window; } return result; } /** * Returns the parameter as an object based on the currently loaded theme. * @param {String} itemName The parameter item name to retrieve. */ Yahoo.Controls.Theme.prototype.getParameter = function(itemName) { var nodes; var itemNode; var itemAttrib; var attribCount; var result; if(this._themeDoc!=null) { // Find the element that describe the GUI item requested nodes = this._themeDoc.evaluate("/theme/parameters/" + itemName); if(nodes.length==1) { itemNode = nodes.item(0); // Create new object result = new Object(); result["itemName"] = itemNode.nodeName; // Loop all attributes in this element for(attribCount=0; attribCount /// (C) Copyright 2005-2006 Yahoo! Inc. All Rights Reserved. /// /** * Defines a format for text. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Constructor /*---------------------------------------------------------------------*/ // Create namespace Yahoo.Drawing if it doesn't already exist if(Yahoo==undefined) { var Yahoo = new Object(); } if(Yahoo.Drawing==undefined) { Yahoo.Drawing = new Object(); } if(Yahoo.Drawing.Common==undefined) { Yahoo.Drawing.Common = new Object(); } /** * Default constructor. * @constructor * @param {String} familyName The font family name of this font object. * @param {String} size The size of this font. */ Yahoo.Drawing.Font = function(familyName, size) { //log("Font.ctor()"); if(arguments.length>0) { this.initialize(familyName, size); } } /*---------------------------------------------------------------------*/ // Public code /*---------------------------------------------------------------------*/ /** * True constructor. Must be called if this class is overridden. * @param {String} familyName The font family name of this font object. * @param {String} size The size of this font. */ Yahoo.Drawing.Font.prototype.initialize = function(familyName, size) { //log("Font.initialize()"); if(familyName==null || size==null) { throw new Yahoo.ArgumentNullException(); } else { this._name = familyName; this._size = parseInt(size); } // arguments == null } /** * Returns a human-readable version of this object. */ Yahoo.Drawing.Font.prototype.toString = function() { return "[name=" + this.name + ", size=" + this.size + "]"; } /*---------------------------------------------------------------------*/ // Public properties /*---------------------------------------------------------------------*/ /** * Gets the family of this font. * @type String */ Yahoo.Drawing.Font.prototype.name getter = function() { return this._name; } Yahoo.Drawing.Font.prototype.name setter = function(value) { throw new Error("name is read-only"); } /** * Gets the size of this font. * @type Integer */ Yahoo.Drawing.Font.prototype.size getter = function() { return this._size; } Yahoo.Drawing.Font.prototype.size setter = function(value) { throw new Error("size is read-only"); } /*---------------------------------------------------------------------*/ /// /// (C) Copyright 2005-2006 Yahoo! Inc. All Rights Reserved. /// /** * Stores a set of numbers describing a two-dimensional location. */ /*---------------------------------------------------------------------*/ /** * Default constructor. * @constructor * @param {Integer} x The x-coordinate of this point. * @param {Integer} y The y-coordinate of this point. */ Yahoo.Drawing.Point = function(x, y) { this.x = x; this.y = y; } Yahoo.Drawing.Point.prototype.toString = function() { return "{x=" + this.x + ", y=" + this.y + "}"; } /*---------------------------------------------------------------------*/ /// /// (C) Copyright 2005-2006 Yahoo! Inc. All Rights Reserved. /// /** * Stores a set of numbers describing the location and size of a rectangle. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Constructor /*---------------------------------------------------------------------*/ /** * Default constructor. * @constructor * @param {Integer} x The x-coordinate of this rectangle. * @param {Integer} y The y-coordinate of this rectangle. * @param {Integer} width The width of the rectangle. * @param {Integer} height The height of the rectangle. */ Yahoo.Drawing.Rectangle = function(x, y, width, height) { this._x = x; this._y = y; this.width = width; this.height = height; } /*---------------------------------------------------------------------*/ // Public code /*---------------------------------------------------------------------*/ /** * Returns a value indicating whether the given co-ordinates are within the rectangle. * @param {Integer} x The x-coordinate of the point to check. * @param {Integer} y The y-coordinate of the point to check. * @type Boolean */ Yahoo.Drawing.Rectangle.prototype.contains = function(x, y) { var result = false; if((this.x <= x) && (x <= (this.x + this.width)) && (this.y <= y) && (y < (this.y + this.height))) { result = true } return result; } /** * Returns the object in a human-readable format. */ Yahoo.Drawing.Rectangle.prototype.toString = function() { return "{x=" + this.x + ", y=" + this.y + ", width=" + this.width + ", height=" + this.height + "}"; } /*---------------------------------------------------------------------*/ // Public properties /*---------------------------------------------------------------------*/ /** * Gets or sets the x-coordinate of this Rectangle. * @type Integer */ Yahoo.Drawing.Rectangle.prototype.x getter = function() { return this._x; } Yahoo.Drawing.Rectangle.prototype.x setter = function(x) { this._x = x; } /** * Gets or sets the y-coordinate of this Rectangle. * @type Integer */ Yahoo.Drawing.Rectangle.prototype.y getter = function() { return this._y; } Yahoo.Drawing.Rectangle.prototype.y setter = function(y) { this._y = y; } /** * Gets the x-coordinate of the top-left corner of this Rectangle. * @type Integer */ Yahoo.Drawing.Rectangle.prototype.left getter = function() { return this._x; } Yahoo.Drawing.Rectangle.prototype.left setter = function() { throw new Error("'left' is read-only"); } /** * Gets the y-coordinate of the top edge of this Rectangle. * @type Integer */ Yahoo.Drawing.Rectangle.prototype.top getter = function() { return this._x; } Yahoo.Drawing.Rectangle.prototype.top setter = function() { throw new Error("'top' is read-only"); } /** * Gets the x-coordinate of the right edge of this Rectangle. * @type Integer */ Yahoo.Drawing.Rectangle.prototype.right getter = function() { return this._x + this.width; } Yahoo.Drawing.Rectangle.prototype.right setter = function() { throw new Error("'right' is read-only"); } /** * Gets the y-coordinate of the bottom edge of this Rectangle. * @type Integer */ Yahoo.Drawing.Rectangle.prototype.bottom getter = function() { return this._y + this.height; } Yahoo.Drawing.Rectangle.prototype.bottom setter = function() { throw new Error("'bottom' is read-only"); } /*---------------------------------------------------------------------*/ /// /// (C) Copyright 2005-2006 Yahoo! Inc. All Rights Reserved. /// /** * Stores a set of numbers describing the size of a rectangle. */ /*---------------------------------------------------------------------*/ /** * Default constructor. * @constructor * @param {Integer} width The width of the size object. * @param {Integer} height The height of the size object. */ Yahoo.Drawing.Size = function(width, height) { this.width = width; this.height = height; } Yahoo.Drawing.Size.prototype.toString = function() { return "{width=" + this.width + ", height=" + this.height + "}"; } tTeB/*---------------------------------------------------------------------*/ /// /// (C) Copyright 2005-2006 Yahoo! Inc. All Rights Reserved. /// /** * Describes available alignment options for controls. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Namespace /*---------------------------------------------------------------------*/ // Create namespace Yahoo.Drawing if it doesn't already exist if(Yahoo==undefined) { var Yahoo = new Object(); } if(Yahoo.Drawing==undefined) { Yahoo.Drawing = new Object(); } /*---------------------------------------------------------------------*/ // Constructor /*---------------------------------------------------------------------*/ /** * Default constructor. */ Yahoo.Drawing.ContentAlignment = { BottomCenter: 512, BottomLeft: 256, BottomRight: 1024, MiddleCenter: 32, MiddleLeft: 16, MiddleRight: 64, TopCenter: 2, TopLeft: 1, TopRight: 4 } bhnra/*---------------------------------------------------------------------*/ /// /// (C) Copyright 2005-2006 Yahoo! Inc. All Rights Reserved. /// /** * EventArgs. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Namespace /*---------------------------------------------------------------------*/ // Create namespace if it doesn't already exist if(Yahoo==undefined) { var Yahoo = new Object(); } /*---------------------------------------------------------------------*/ // Constructor /*---------------------------------------------------------------------*/ /** * Default constructor for EventArgs. * @constructor */ Yahoo.EventArgs = function() { this.initialize(); } /*---------------------------------------------------------------------*/ // Public code /*---------------------------------------------------------------------*/ /** * True constructor. Must be called when this class is overridden. */ Yahoo.EventArgs.prototype.initialize = function() { this.cancel = false; } /*---------------------------------------------------------------------*/ /// /// (C) Copyright 2005-2006 Yahoo! Inc. All Rights Reserved. /// /** * raiseEvent function. */ /*---------------------------------------------------------------------*/ /** * Raises an event to all subscribed listeners. * @param {Object} sender The object that raised this event. * @param {Array} eventHandlers The array of event handlers to call. * @param {Yahoo.EventArgs} e The event details. */ Yahoo.raiseEvent = function(sender, eventHandlers, e) { var count; if(eventHandlers!=null) { for(count=0;count /// (C) Copyright 2005-2006 Yahoo! Inc. All Rights Reserved. /// /** * The exception that is thrown when an argument is outside the valid range for an enumerator. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Namespace /*---------------------------------------------------------------------*/ // Create namespace Yahoo if it doesn't already exist if(Yahoo==undefined) { var Yahoo = new Object() } /*---------------------------------------------------------------------*/ // Constructor /*---------------------------------------------------------------------*/ /** * Default constructor. * @constructor * @param {String} paramName The name of the parameter. * @param {String} message The error text for this exception. * @param {String} type The type of the enumeration this exception is related to. */ Yahoo.InvalidEnumArgumentException = function(paramName, message, type) { this.initialize(paramName, message, type); } /** * Define inheritance chain. */ Yahoo.InvalidEnumArgumentException.prototype = new Error(); Yahoo.InvalidEnumArgumentException.prototype.constructor = Yahoo.InvalidEnumArgumentException ; Yahoo.InvalidEnumArgumentException.prototype.baseclass = Error.prototype; /*---------------------------------------------------------------------*/ // Public code /*---------------------------------------------------------------------*/ /** * True constructor. Must be called if this class is overridden. * @param {String} paramName The name of the parameter. * @param {String} message The error text for this exception. * @param {String} type The type of the enumeration this exception is related to. */ Yahoo.InvalidEnumArgumentException.prototype.initialize = function(paramName, message, type) { this.paramName = paramName; if(message!=null && message!="") { this.message = message; } else { this.message = paramName; } this.name = "InvalidEnumArgumentException "; this.type = type; } a,|hn/*---------------------------------------------------------------------*/ /// /// (C) Copyright 2005-2006 Yahoo! Inc. All Rights Reserved. /// /** * format function. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Namespace /*---------------------------------------------------------------------*/ // Create namespace Yahoo if it doesn't already exist if(Yahoo==undefined) { var Yahoo = new Object(); } if(Yahoo.Utility==undefined) { Yahoo.Utility = new Object(); } /** * Replaces the format item in the given string with the text equivalent of the corresponding object instance in the array. * Replaces "{n}" with arguments[n]. Currently does not do any formatting on the values. * @param {String} text The template text to format. * @param {Object} args The content to fill the template with. */ Yahoo.Utility.format = function(text, args) { var result; // Do format result = text.replace(/\{(\d+)\}/g, function(match, count) { return args[count]; }); return result; } Qw/*---------------------------------------------------------------------*/ /// /// (C) Copyright 2005-2007 Yahoo! Inc. All Rights Reserved. /// /** * Library management class for a local (non-shared) installation of library. Does not support modifying the library. */ /*---------------------------------------------------------------------*/ // Constructor /*---------------------------------------------------------------------*/ // Create namespace Yahoo.Utility if it doesn't already exist if(Yahoo==undefined) { var Yahoo = new Object() } if(Yahoo.Utility==undefined) { Yahoo.Utility = new Object() } /** * Default constructor. * @constructor * @param {String} libraryPath The path to the library root folder. */ Yahoo.Utility.Library = function(libraryPath) { if(arguments.length > 0) { this.initialize(libraryPath); } //arguments.length > 0 } /*---------------------------------------------------------------------*/ // Global constants /*---------------------------------------------------------------------*/ // These are defined here to provide hardcoded default settings to all items in the library Yahoo.Utility.Library.prototype.defaultTheme = "Black Glass"; /*---------------------------------------------------------------------*/ // Private code /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Public code /*---------------------------------------------------------------------*/ /** * True constructor. Must be called if this class is overridden. * @param {String} libraryPath The path to the library root folder. */ Yahoo.Utility.Library.prototype.initialize = function(libraryPath) { if(libraryPath!="") { this._libraryPath = libraryPath; } // libraryPath = "" else { throw new Error("Required parameter 'libraryPath' missing."); } // libraryPath = "" } /** * Includes the given class into the currently running widget. * @param {String} className The full name of the class to include into the currently running widget. * @param {String} version The version of the class to include into the currently running widget. * @param {Boolean} exactVersion A value indicating whether the exact version should be included. If false, the latest version will be used. */ Yahoo.Utility.Library.prototype.include = function(className, version, exactVersion) { var classPath; var classExists; if(className!="") { // Check if the given class has already been included try { if(eval(className)==undefined) { classExists = false } else { classExists = true; } // className==undefined } // try catch(e) { classExists = false; } if(classExists==false) { classPath = this.getClass(className, version, exactVersion) if(classPath!="") { include(classPath); } // classPath!="" } // class already included } // className = "" else { throw new Error("Required parameter 'className' missing."); } // className = "" return classPath; } /** * Gets the path to the class to include. * @param {String} className The full name of the class to get the file name for. * @param {String} version Not implemented! This parameter is only used in the shared version of this class. */ Yahoo.Utility.Library.prototype.getClass = function(className, version) { var count; var classPath; var names; var library; var fullPath = ""; var dirContents; var file; var versions; var result = ""; if(className!="") { // Get full path to folder where this class should be located classPath = this._libraryPath; names = className.split("."); for(count=0; count /// (C) Copyright 2005-2007 Yahoo! Inc. All Rights Reserved. /// /** * Library management class. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Constructor /*---------------------------------------------------------------------*/ // Create namespace Yahoo.Utility if it doesn't already exist if(Yahoo==undefined) { var Yahoo = new Object() } if(Yahoo.Utility==undefined) { Yahoo.Utility = new Object() } /** * Default constructor. * @constructor * @param {String} libraryPath The path to the library root folder. */ Yahoo.Utility.Library = function(libraryPath) { if(arguments.length > 0) { this.initialize(libraryPath); } //arguments.length > 0 } /*---------------------------------------------------------------------*/ // Global constants /*---------------------------------------------------------------------*/ // These are defined here to provide hardcoded default settings to all items in the library Yahoo.Utility.Library.prototype.defaultTheme = "Purple"; /*---------------------------------------------------------------------*/ // Private code /*---------------------------------------------------------------------*/ /** * Recursively creates given directory structure. * @private * @param {String} path The path to directory to create. */ Yahoo.Utility.Library.prototype._createDirectory = function(path) { var count; var parts; var part; var currentPath = ""; try { parts = path.split("/"); for(count=0; count 1) { result = match[1] -0; } else { result = 0; } return result; } /*---------------------------------------------------------------------*/ // Public code /*---------------------------------------------------------------------*/ /** * True constructor. Must be called if this class is overridden. * @param {String} libraryPath The path to the library root folder. */ Yahoo.Utility.Library.prototype.initialize = function(libraryPath) { if(libraryPath!="") { this._libraryPath = libraryPath; } // libraryPath = "" else { throw new Error("Required parameter 'libraryPath' missing."); } // libraryPath = "" } /** * Adds the given file as a shared class in the library. * @param {String} className The full name of the class to add to the library. * @param {String} version The version of the class to add to the library. * @param {String} fileName The file name of the class to add to the library. * @param {replace} replace A value indicating whether an existing class with the same name and version should be overwritten. * @returns * -1 = Unknown error. * 0 = Library added. * 1 = Library already exists. */ Yahoo.Utility.Library.prototype.addClass = function(className, version, filename, replace) { var count; var classPath; var names; var library; var destFilename; var skip = false; var result = -1; if(className!="" && version!="" && filename!="") { // Get full path to folder where this class should be located classPath = this._libraryPath; names = className.split("."); for(count=0; count 0) { // Sort array versions.sort(this._numericCompare); // Get path to the library fullPath = classPath + "/" + library + ".v" + versions[versions.length-1].toFixed(2) + ".js"; } // if versions.length > 0 } // for dirContents } // if version!=null // Check if library file exists if(filesystem.itemExists(fullPath) == true) { result = fullPath; } } // if classPath exists } // className = "" else { throw new Error("Required parameter 'className' missing."); } // className = "" return result; } /** * Adds a resources path for the class. * @param {String} className The full name of the class to add to resources to. * @param {String} version The version of the class to add to resources to. * @returns * -1 = Unknown error. * 0 = Path added. * 1 = Path already exists. */ Yahoo.Utility.Library.prototype.addClassResourcePath = function(className, version) { var count; var classPath; var names; var library; var result = -1; if(className!="" && version!="") { // Get full path to folder where the resources for this class should be located classPath = this._libraryPath + "/" + className.replace(/\./g, "/") + "/res/" + version.toFixed(2); // Check if path for this namespace exists if(filesystem.itemExists(classPath)==false) { // Create path for this namespace this._createDirectory(classPath); // Check if we succeeded if(filesystem.itemExists(classPath)==true) { result = 0; } // If success else { result = -1; } // If success } // If exists already else { result = 1; } // If exists already } // parameters != "" else { throw new Error("Required parameter missing."); } // parameters != "" } /** * Gets the path to the class resources. * @param {String} className The full name of the class to get the path to resources. * @param {String} version The version of the class to get the path to resources. */ Yahoo.Utility.Library.prototype.getClassResourcePath = function(className, version) { var count; var classPath; var fullPath = ""; var dirContents; var folder; var versions; var result = ""; if(className!="") { // Get full path to folder where the resources for this class should be located classPath = this._libraryPath + "/" + className.replace(/\./g, "/") + "/res"; // Check if path for this namespace exists if(filesystem.itemExists(classPath)==true) { // If asked for exact version, check for correct file if(version!=null) { // Path is in the form "library/my/name/space/res/1.00" fullPath = classPath + "/" + version.toFixed(2); } // if version!=null else { // Not asked for exact version, get newest available version dirContents = filesystem.getDirectoryContents(classPath); // Get version number for each folder and add to an array versions = new Array(); for(count=0; count 0) { // Sort array versions.sort(this._numericCompare); // Get path to the library fullPath = classPath + "/" + versions[versions.length-1].toFixed(2); } // if versions.length > 0 } // for dirContents } // if exactVersion==false // Check if library folder exists if(filesystem.itemExists(fullPath) == true) { result = fullPath; } } // if classPath exists } // className = "" else { throw new Error("Required parameter 'className' missing."); } // className = "" return result; } /*---------------------------------------------------------------------*/ // Public properties /*---------------------------------------------------------------------*/ /** * Gets the base path for libraries. * @type String */ Yahoo.Utility.Library.prototype.libraryPath getter = function() { return this._libraryPath; } Yahoo.Utility.Library.prototype.libraryPath setter = function() { throw new Error("libraryPath is read-only."); } /*---------------------------------------------------------------------*/ /// /// (C) Copyright 2005-2006 Yahoo! Inc. All Rights Reserved. /// /** * stripHtml function. */ /*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/ // Namespace /*---------------------------------------------------------------------*/ // Create namespace Yahoo if it doesn't already exist if(Yahoo==undefined) { var Yahoo = new Object(); } if(Yahoo.Utility==undefined) { Yahoo.Utility = new Object(); } Yahoo.Utility.HtmlEntities = {'nbsp':160,'iexcl':161,'cent':162,'pound':163,'curren':164,'yen':165,'brvbar':166,'sect':167, 'uml':168,'copy':169,'ordf':170,'laquo':171,'not':172,'shy':173,'reg':174,'macr':175,'deg':176,'plusmn':177, 'sup2':178,'sup3':179,'acute':180,'micro':181,'para':182,'middot':183,'cedil':184,'sup1':185,'ordm':186, 'raquo':187,'frac14':188,'frac12':189,'frac34':190,'iquest':191,'agrave':192,'aacute':193,'acirc':194, 'atilde':195,'auml':196,'aring':197,'aelig':198,'ccedil':199,'egrave':200,'eacute':201,'ecirc':202, 'euml':203,'igrave':204,'iacute':205,'icirc':206,'iuml':207,'eth':208,'ntilde':209,'ograve':210,'oacute':211, 'ocirc':212,'otilde':213,'ouml':214,'times':215,'oslash':216,'ugrave':217,'uacute':218,'ucirc':219,'uuml':220, 'yacute':221,'thorn':222,'szlig':223,'agrave':224,'aacute':225,'acirc':226,'atilde':227,'auml':228,'aring':229, 'aelig':230,'ccedil':231,'egrave':232,'eacute':233,'ecirc':234,'euml':235,'igrave':236,'iacute':237,'icirc':238, 'iuml':239,'eth':240,'ntilde':241,'ograve':242,'oacute':243,'ocirc':244,'otilde':245,'ouml':246,'divide':247, 'oslash':248,'ugrave':249,'uacute':250,'ucirc':251,'uuml':252,'yacute':253,'thorn':254,'yuml':255,'lt':38,'gt':62, 'amp':38,'apos':39,'quot':34,'oelig':338,'oelig':339,'scaron':352,'scaron':353,'yuml':376,'circ':710,'tilde':732, 'ensp':8194,'emsp':8195,'thinsp':8201,'zwnj':8204,'zwj':8205,'lrm':8206,'rlm':8207,'ndash':8211,'mdash':8212, 'lsquo':8216,'rsquo':8217,'sbquo':8218,'ldquo':8220,'rdquo':8221,'bdquo':8222,'dagger':8224,'dagger':8225, 'permil':8240,'lsaquo':8249,'rsaquo':8250,'euro':8364,'fnof':402,'alpha':913,'beta':914,'gamma':915,'delta':916, 'epsilon':917,'zeta':918,'eta':919,'theta':920,'iota':921,'kappa':922,'lambda':923,'mu':924,'nu':925,'xi':926, 'omicron':927,'pi':928,'rho':929,'sigma':931,'tau':932,'upsilon':933,'phi':934,'chi':935,'psi':936,'omega':937, 'alpha':945,'beta':946,'gamma':947,'delta':948,'epsilon':949,'zeta':950,'eta':951,'theta':952,'iota':953, 'kappa':954,'lambda':955,'mu':956,'nu':957,'xi':958,'omicron':959,'pi':960,'rho':961,'sigmaf':962,'sigma':963, 'tau':964,'upsilon':965,'phi':966,'chi':967,'psi':968,'omega':969,'thetasym':977,'upsih':978,'piv':982, 'bull':8226,'hellip':8230,'prime':8242,'prime':8243,'oline':8254,'frasl':8260,'weierp':8472,'image':8465, 'real':8476,'trade':8482,'alefsym':8501,'larr':8592,'uarr':8593,'rarr':8594,'darr':8595,'harr':8596, 'crarr':8629,'larr':8656,'uarr':8657,'rarr':8658,'darr':8659,'harr':8660,'forall':8704,'part':8706, 'exist':8707,'empty':8709,'nabla':8711,'isin':8712,'notin':8713,'ni':8715,'prod':8719,'sum':8721, 'minus':8722,'lowast':8727,'radic':8730,'prop':8733,'infin':8734,'ang':8736,'and':8743,'or':8744, 'cap':8745,'cup':8746,'int':8747,'there4':8756,'sim':8764,'cong':8773,'asymp':8776,'ne':8800, 'equiv':8801,'le':8804,'ge':8805,'sub':8834,'sup':8835,'nsub':8836,'sube':8838,'supe':8839,'oplus':8853, 'otimes':8855,'perp':8869,'sdot':8901,'lceil':8968,'rceil':8969,'lfloor':8970,'rfloor':8971,'lang':9001, 'rang':9002,'loz':9674,'spades':9824,'clubs':9827,'hearts':9829,'diams':9830} /** * Strips all HTML code and returns a plain text string. * @param {String} text The HTML string to convert into plain text. * @param {Boolean} brToLineFeed A value indicating whether BR tags should be converted into line feeds. * @param {Boolean} doublePass A value indicating whether a double pass of HTML decoding should be done. */ Yahoo.Utility.stripHtml = function(text, brToLineFeed, doublePass) { var result; result = text; // Remove any newline characters result = result.replace(/[\r]+/, ""); // Convert
tags to linefeeds \n if(brToLineFeed==true) { result = result.replace(/<\/?br[^<>]*>/g, "\n"); } // Strip HTML tags result = result.replace(/<\/?[a-z][a-z0-9]*[^<>]*>/g, ""); // Convert HTML entities result = Yahoo.Utility.decodeHtmlEntities(result); if(doublePass==true) { result = Yahoo.Utility.decodeHtmlEntities(result); } // Remove double whitespaces result = result.replace(/[ \t]{2,}/g, " "); // Remove whitespaces from start and end of string result = result.replace(/^[ \t]+|[ \t]+$/mg, ""); return result; } /** * Converts HTML entities into text. * @param {String} text The HTML string that contains encoded HTML entities that should be decoded. * @type String */ Yahoo.Utility.decodeHtmlEntities = function(text) { var charRegEx = /&(?:(\w{2,7})|#(\d{2,4}));/g; var hit; var charCode; var lastHit = 0; var result = ""; while((hit=charRegEx.exec(text))!=null) { // Decimal values are always in group 2 charCode = new Number(hit[2]); if(isNaN(charCode)==true) { // Not a decimal number, get from entity map charCode = Yahoo.Utility.HtmlEntities[hit[1].toLowerCase()]; } result += text.substring(lastHit, hit.index) + String.fromCharCode(charCode); lastHit = hit.index + hit[0].length; } result += text.substring(lastHit); return result; } ,}\PNG  IHDRpcHtIME  = pHYs  ~gAMA a IDATxc```IENDB`K}PNG  IHDRpcHtIME :S pHYs  d_gAMA a IDATxchhhu.IENDB`k|\PNG  IHDRhtIME 6dR pHYsN N }gAMA a IDATxc`IENDB`}2PNG  IHDRpcHtIME 4k= pHYs  ~gAMA a IDATxc?3IENDB`V565 F2PNG  IHDRvtIME 88' pHYsaa?igAMA a-IDATxe1jP',l#eAB &-Ϳ=nMJx&1M^QG gAeXSIENDB`9PNG  IHDRtIME : pHYsaa?igAMA abIDATxMʡ ϗ4 LD af`PъSMZ+B؇H)m3z1f#Ƹ콃/K)A!ďI$myIENDB`FPNG  IHDRvtIME :4&K pHYsaa?igAMA a'IDATxeP@[3EQ"0 9@_?m۾\I8N}EI hw`wz#=Ǫz4 -l6{11Yu,(%Jr9XRgL&8)m4M{`RIA, `0(K&B^Y:6p8bfr!BPxZ&`aDض0͞ jEKVׅ0N=pLh4d~}zQ/oUxc0 fM:$y(fZ,5 ]6 ;j5{>_}@dr}`&@[Oh'u]UqYzNIENDB`0PNG  IHDRl$"tIME 7 Y pHYs  gAMA aIDATxc>e('řIENDB`PNG  IHDR tIME 4( pHYs  gAMA a!IDATxc # RRR uVBr#IENDB`0PNG  IHDR8g<tIME  4 pHYs  gAMA aIDATxc`@.\AΝ@޽ @5dKccc"z?ڵX7R"E#+\`˗?핑ϟ?pݯ ikk:4gf0-kIENDB`>PNG  IHDRhstIME 5p6 pHYs  gAMA aaIDATxc)πX@(ҥAAA3߼yc VPPӡR&**sʕE)iPYq 1o<Zu[.1IENDB``PNG  IHDRhstIME 6ZD} pHYs  gAMA adIDATxc;ua`!A^^3e@?#HY@k=GG3@3rrrLPcs<))P FFƗ+η\IENDB`PNG  IHDRhstIME 4f pHYs  gAMA a^IDATxc` qccG ]fQYS"o3ihh3B8_pp+W\AjgbaM, IENDB` PNG  IHDRhstIME 6!3 pHYs  gAMA a`IDATxc ?]99` V(//ca(ePSS r1H ??#455JCi+~IENDB`!PNG  IHDRP*tIMElys pHYsN N }gAMA aCIDATxc`cc{_@3++{ˌ(LY F,;3PD KIIENDB`g" PNG  IHDR=GtIME &kI< pHYsN N }gAMA aDIDATxc066~(A:4Ag NWQL7qydrL&*id(1J KIENDB` v#!PNG  IHDR׀tIME#{ pHYsN N }gAMA a~IDATxc```e #aK H,4.~6.Ib%˂  L)bd 1R$b@@Iq /(:PR;\ %f)VFCq -n9oϨ2?D?;c#IENDB` X%g"PNG  IHDR }tIME*' pHYsN N }gAMA aQIDATxXQ0 -_㕼|11PFXu]Fy~e ,"4e!nf MSˡMˠ)̠2Pc"=g;}D`UfPDe(oP(ξKB1/rz̉fY>sd"I3OGlJ`1fI8H9qA ix+B'\돊r#:XSc|\|s<}{^g{s~=!V0mxG+/~+@*w*ȖO^, h鞆6$L²E, CoGC SJyI 3([PKe Y61Oy/`rƾo1żԤl[ y,\כq @U>EJ ߔ+O>UFiezuU4tzhH{)) PSWϋaЙB•dL%Q3t+42S/FiP5 =s4@aH!!{52B6qJ ?)@̟&mt3+ L EuƕmQ>qk:5lNg߆g Yl*Zռ,.goֶk: vy(V'4H(y4Fc"4Qڒcaڢ.ByP!U&ⅫgeJJJ+gJQaVPf*R5&`lҨԌYn8\ kЁШ~ +Y XWq1l քڀ(TWܑb Xrf,uU+[M*ңNfLgjAy1 ڛ۽d&,q; %?v:B87w ڍ뢔"1n= nSB/FK&7l/ s_n?|: v) c Y`WFAQuFmY)q rVՊ sd^]{vd[612m]4\8-L9$&c ;-'B^V6bsyGzQKt٥j=%P٩ .B=C!]kc%H3 2 jG2[w?'8ZޓqIENDB` 1P+PNG  IHDR ldtIME_ pHYsN N }gAMA a[IDATxڕRAJ@fc ]=M~ħ!<EE<Όա;Nq2tg1){e4?fxӍ%<*"+uJ7!e 8^n6Igj80<H.kLXiz52P-1 =P''/HrPMD Sd% bM'"/MS!n 1h@K`)Կ\j ݜA42f5p{be|ฝ̏}U񍅠N|WyQZIԲ gW T]EIENDB`K +Y3"/PNG  IHDRtIME8+UJ pHYsN N }gAMA aIDATxڅRJCAݛ@ Shk#E?K l,BEQoA,ٻr>l]Y"Xޤq_7p\I{_:y\p's~\PYlb>gmu g&d('5rpίX{Dْ]s㧟+eJ4$F,-p}2E(pE+'w$3ҧ_%Lo:KIENDB` 861PNG  IHDR KwztIME8;XF pHYs  gAMA aNIDATxڕU@]?@ ED(E ~&Qt$U|J>E蚷@͌@2Y{윳t:`WyXob8l6k^\VBgUSF|µZ S9˥œB!JZ D)L914*`Ox Iw@<\ Gjv_@B8Rc6MgeF~F|&n/lq`Ep7Hz@d{q)uu0ƨs(&v #\T>u0 Sn]D8@h۞Vt:ĵ` Sy!C C)-(  R—kX nEm`r,,y/(B4Yv-\.,L* ??jr#5973R)"+ٌG< W 6 Lgk4uXT'|+$I.0*=@[.O=A,mk$ud'M/wI(*~SMlAIENDB` 9Y3PNG  IHDRWtIME3VeD pHYs  gAMA a&IDATxڕUMOAJhB I=i1D.#1"!=?ћń@H0E4RZ>nӝ},Jca LMMPYyq2SX\Fȋ D]k\U...766~cNfvww߰Fs,$JmZfn`} b}}2دtML&Z.mDbGD?@hqkfbьFy,-EB :&Bv$Hd^hꑠI-LӴ[V&5>>T*}55z7G$r"ά d>=88DtLUJB04L~{:OC"1`D%>ett eL-& Wp7%fonOp|(R9T޳YTI˲@sD7[7UQ7koon]~"wGGGV&:/BL&E<BVq|8<<|u\fRfdUrYZOOOH$bI?UyK.]WEnP+AS@}׭A <7EPL\J ikQ ؔ~1 L}T5j:g?yeOHcĕ/5n5PyfvP}1o 9"&|9h{|PN#/=k(wÄݑ9'euIENDB`q Q`=86PNG  IHDRVΎW pHYs  gAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxb` FlR ̉&?322~F@L<AVPPXE @Ȇ)Y˗/w31?pMǏ38p`5P1u@lcŋ;/_29s̬|ˁ= S*_p‚߿ ?~j??? :Mv#аOsDNN@iiiŋ o޼a]xƍZ *+3aaa??2|Ç ޽_>>>ϟ  X3%61̜9|!,,ٳg ~9$@01¿Njj*8`\2YX@0X c 6HA|@0}SQQ9pqqq+=zĐg&J2PRR Eoց~ ,RRֶd@] $ <H ɓ' mX|y(%;w0ܽ{3  @虖 ]V񤦦;EE&jZdQR@MpL@޹  =6;/=cIENDB`<  >9PNG  IHDR8etIME 3~i pHYsN N }gAMA aIDATxchhh_~Q< kSIENDB`\ >`=PNG  IHDR"8tIME 2! $ pHYsN N }gAMA aTIDATxcgd``@_=\$**$""%и 3H* vvv`L\\\d0(ԎaVw{ɣIENDB`| ? >PNG  IHDR"8tIME 202 pHYsN N }gAMA aCIDATxc```$, gb`fpD*aYngg ˓̠P;9 sIENDB` l@>PNG  IHDR8etIME 3 礽{ pHYsN N }gAMA aIDATxcPPPghhh,7 kIENDB` eA?PNG  IHDRhstIME 5I pHYsN N }gAMA ahIDATxcxY=CCCW=CYY+Ç@uuu~,ܹT# b|uh(_qyTTT(/MIENDB` WBl@PNG  IHDRhstIME 5HV pHYsN N }gAMA aaIDATxchhhٳz_~3@^^/?P*Ơ 5@,b8rȿ={0~/++Kk!17XyIENDB` TCeAPNG  IHDRhstIME 6  pHYsN N }gAMA alIDATxc`zFz/)((hV PQQF07ׯ(./_NabTUUI}W333d/xb? fY|"w* pcO*W%fCIENDB` XIGPNG  IHDRvf4tIME оr pHYs``zxEgAMA a@IDATxc```b /  BBB̏?37fff~a*  KfIENDB`? +JHPNG  IHDRvf4tIME  ?I pHYs``zxEgAMA aBIDATxc`gg! 3Pfff{!!k׮)U0_r})H H9##c Z$r.IENDB`d ~JXIPNG  IHDRhtIME  ,~ pHYs``zxEgAMA a IDATxc`85_>IENDB` K+JPNG  IHDRatIME : @A pHYsN N }gAMA aCIDATxc`Hff0ca2 CC7/? L L L L`q C ?J>IENDB` ALJPNG  IHDRCtIME 73/9g pHYs  gAMA aIDATxc?(D$w:IENDB` }LKPNG  IHDRpcHtIME 95wϱ pHYs  gAMA a IDATxc?3IENDB` }{MALPNG  IHDRpcHtIME 8hy pHYs  gAMA a IDATxc000$?IENDB` }NLPNG  IHDRpcHtIME 9 w pHYs  gAMA a IDATxcx#IENDB`, N{MPNG  IHDRtIME 8 F8 pHYs  gAMA aIDATxc000`sݻ>|4~&XӃIENDB`L ~ONPNG  IHDR!/)tIME 7۔ pHYs  gAMA a+IDATxc@>3_~#[$uunIENDB`m 8PNPNG  IHDR!/)tIME 84Ӱ pHYs  gAMA a)IDATxc vvv#p̏? b ? Vy}IENDB` P~OPNG  IHDRtIME 64P pHYs  gAMA a6IDATxc``Ν;`?æMEk2p.IENDB` Q8PPNG  IHDRtIME 9"4 pHYs  gAMA aGIDATxc000`ggWxΝnb` }ݻw Ê+^Ç PtH IENDB` \PPNG  IHDRwS pHYs  ~ OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxb8SL?}IENDB` gQPNG  IHDRwS pHYs  d_ OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxb'#N'UIENDB`  r\PNG  IHDRĉ pHYsN N } OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxb?ӥuaIENDB` & }gPNG  IHDRwS pHYs  ~ OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxb?^IENDB` B rPNG  IHDRqu pHYsaa?i OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxڌѱJQ]HH cX>aX! VAp]D.i~fs&rΖ籃K np|qvj\Oj&srFaUMnG nlJm]7a}O=O&gF#z'\< H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FJIDATxT 0r.^ )?!$%%ɎdCVFzC,HLXb"NIENDB`  PNG  IHDRqu pHYsaa?i OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxڌ=JCA3\}:],mbac b$F|L 9ܛ=8=ntnǧSf+I#-ɢfhQõ} ڽ`V0ջTudn>,zū%b| gF5ʔJoq}CIENDB`  ߔPNG  IHDR;mG pHYsN N } OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F!IDATx쎱NAE #Y#@P>/0Ž0&V&~-&M,Ͳ X(vuwE1R`` zJj鈴wa\29jrߌ!j_u(:Z9/]a'Pbzpw(0ޞ j15m,xIqNb4 $ȴ,D'P 3!%*fvƒQbЙOwA]glYIaOs#U%=`ymvL&wIENDB`  iPNG  IHDR Vu\ pHYsN N } OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxڌ/KCa.m ~ abG0n&kV넃 Xe`5ZpI9뙥T9GoA+`9Ţlvq=\жR97Y4{G͔S#vp)&c7X4 %ֱ kn?P~-lcS\vX9X{OCf/r1rQ#4BrIENDB`  PNG  IHDR pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F#IDATxb?C  wOE30m RIENDB`(  iPNG  IHDR% pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F3IDATxD1 E`Sp4MKα 2xaBv_SV ٿIENDB`  PNG  IHDR pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxbƖW_71C9IENDB` 8 PNG  IHDR pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxbxpdW0x;IENDB` V PNG  IHDR pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F#IDATxb ÛfL< 6L\L 1tUIENDB` tr uPNG  IHDROW pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxb?0Y1 rx xv'q ?p׿)BAqe `κg[5ɊY`Ɋ 3FC7a-ZxjK h" UP`sIENDB`e E PNG  IHDRo& pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FpIDATx @46M-DKI-BB * E*xBJrXmKMJk>ߧ'eջ۰Q<_okm*:t 4l "IENDB`k K EuPNG  IHDRo& pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FvIDATxi!'/\Ў #P5e9=ˉe?r2sl'; IENDB`X 8 PNG  IHDRo& pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FcIDATx,ʱ @@яp"Dm 3`,q4\į}y:@3 F?h ֕?6,e}ol]s[w@<aIENDB`e E )EPNG  IHDRo& pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FpIDATx `.!`̯`0naJa" $w',ZV:%^2`tnCBL~E74T ɬIENDB`'  )4PNG  IHDRW pHYsN N } OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F2IDATxt1@P@zu$"7KSSK:ps Z!IENDB`= ) f?)PNG  IHDR=G pHYsN N } OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FHIDATxb?5u )CLdu &[F C J)4PNG  IHDRа" pHYsN N } OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIIDATxb8a'dJIENDB`k ]K Vf?PNG  IHDR  pHYsN N } OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FvIDATx1 0'"e ml,^D%0R,wH؀'j/휮ƅYoO"0Na''k7D0O<tE0sN1;xIENDB`' w 6aJPNG  IHDR&ɧb pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F2IDATxb7#v !?. ,T`IENDB`  -oVPNG  IHDR|fu pHYsN N } OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxڤKa?3niJ%[{9D!DԭTХ[/)n/ ta1 OaeEt0D P;"Eg  ~h XIENDB`  =|6aPNG  IHDR|fu pHYsN N } OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxԔ?oAg81 `H# )T4 ht|7!HD(,ℜg_|Kqgb 4iWz3y2v̅=t ?ܙXHG?/KQ2[Bl #><8qCGZ7 $gfա8̈Ї`F+VГof nTAfִ|COG H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxڌM@@k'IPU6h-DpįmFZ758 ]쳡HQ}4Ԡ cM-iT+.*1: [{N znxoxAviVY&a㈣ʢUX:guQ`=N9"PLN#ʈ)&}hn[@ m@k[ Gv? 6iFehnHIENDB`  0=|PNG  IHDR5T pHYsN N } OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxڌKN0EOl)`r0`*$0,RHJu3FM+Y__E媀hpqR0 rPJ΀5'P[`'n’&=0Jlh `+ؔʄQ{ <?R+ؘsR@{^G /"$wڽ1w;u82Qdr2jAOjP#do N覗s)$8ۘ/AƑO i40'0ob +Z`. \Q՚kw)KIENDB`  "PNG  IHDR  H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxܔ @F߬`Vk`+15I6@NٷQU>$ {`l89|![ ́]0T"~sJ`'ve(o8%pf4^!"nOF1pj^&IVֵҭ AZq!}0ަ^SK?"&c H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F`IDATxڼ1N@E_;vB)9W3BT\&( x)M&2h?c O -W11F W q8BԈ Q"/ 斍}G!{d`0 qlk]e՛1΁'~3io@e,4uQae@N+Cn:-HHeO=B Áuh}A?Gxɮ(eSt`)TԭkYf])1BddIENDB`kAKίPNG  IHDRb;wtEXtSoftwareAdobe ImageReadyqe<IDATxY0 n h!:t@m6lV^ 'loP'[dp>KnGtmH|o  51$Vlj>eUP}SMby LĶƂیm[oMm\Wwv=t{ 6{"]xqu ҉=qyDq[fxT biA`K'&6ݍK.9I6-GJ8=8sqN 5Pmv3t:ǫ8 DOR8Z8?p3B g/[7kn1WQX3Z6![WGgOge5_+û#{na)j9GyU0VV%~̖#,q+!:&Q-X5(*Һq#2mҪ I~s5S&ڗ+=Iv(IewRErU~ 0sfIENDB`Y6]96'c yn ίPNG  IHDRVΎW pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxڬ?LSQ?6(PMc@b1Q# 0418.5qPtPbB D(H hKã?7{O}s]ى%(lm ߖDYn7P|aړ$_M1kw" t:,I :~wM)@0,M0nU.?,$t,A]~w$UF/Xl3 2AܕchB*g3TG" Aq4y\\t6 3,LpE|{cpAL$c H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxb'?Ù"  Q5Ԙ#IENDB`!   PNG  IHDR"u pHYsN N } OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F,IDATxb?MW&&6&f8CxJ`TjvIENDB`!    PNG  IHDR"u pHYsN N } OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F,IDATxb H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxbPp?=W Y'yIENDB`b B +  PNG  IHDRo& pHYsN N } OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FmIDATx41Pׯ\AzfX*a묓&ewh.Bl$W*UxR]H,5uKi]^OnkaIENDB`b +B 6  PNG  IHDRo& pHYsN N } OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FmIDATx410ѯԉp/fb 7r3 22t-C Mw=%UxF^/ڼ| 7{] Y-2ZDYRl$RI;  pq 8+ LuIENDB`c IC DB + PNG  IHDRo& pHYsN N } OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FnIDATx,1 `ׯOVAi( MprO:'L-ICqy I@ ~ *j=^fF;i?*F+R㪰pʅ6 i'FIENDB`c gC M 6 PNG  IHDRo& pHYsN N } OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FnIDATxbPþ[3)b '01XS߳O f)Ť$v-l&V5&ae`````f IB'@IENDB`  X DB PNG  IHDRL' pHYs``zxE OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxb8SĐ3 j5YgIENDB`  c M PNG  IHDR pHYs``zxE OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxb8S0 g1N$IENDB`  n X PNG  IHDR pHYs``zxE OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxb?1:T_IENDB`  y c PNG  IHDR pHYs``zxE OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F#IDATxb8S0L 3_0( RCIENDB`1  $ n PNG  IHDR͹ pHYs``zxE OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FAIDATxLɱ 0@K8dt.DN@A uK[U|́Cqɸ0X IENDB`< M  $ PNG  IHDRqV pHYs``zxE OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FGIDATxb H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FGIDATxbR0/ 󘴋N5bfb7`wwi& jg`aa``ubIENDB`  ڱ PNG  IHDRĉ pHYs``zxE OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxbtս/IENDB`"   Ҧ PNG  IHDRQE pHYsN N } OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F-IDATxb?K B321100A_<۲KIENDB`   ڱ PNG  IHDRݿ pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxb?L P1IENDB`   PNG  IHDRwS pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxb?^IENDB`   PNG  IHDRwS pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxb?*!BIENDB` * !  PNG  IHDRwS pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxb?CHIENDB` G 0  PNG  IHDRm pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxb?L   7=%IENDB`) d Y ! PNG  IHDRV( pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F4IDATx'`r3&poQ1IENDB`)   0 PNG  IHDRV( pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F4IDATx'`%w)5IENDB`6   Y PNG  IHDR~ pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FAIDATx41@0TLVg|y]*r()6p.E@?L+6p5XIENDB`@   PNG  IHDR~ pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FKIDATxb??+&go 10\K!7W30000p V WgIENDB`0  (,  PNG  IHDRW pHYsN N } OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F;IDATx<1@@{ H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F`IDATx10 ]V3yCmv@!"\%2ĨL(Sg!;=*Rӳ' X:8 ƹ0KD7hz: {GIENDB`  %C (, PNG  IHDR  pHYsN N } OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATx엱0 D_t @HPmf*$k)r8gtMp{%H Q&9^uAX1Z  M5 Z]n6'Ypkifrlվ Q}y*&?38㬰xvAW1H2s?dEW,j.BIENDB`4 - YN }7 PNG  IHDR&ɧb pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F?IDATxb/L /Nfb```$ x.,ÿ0`;<+IENDB` H ^Z %C PNG  IHDR kT2 pHYsN N } OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxڔ=nA_J9S @B" D@B TԠҌFMoo<Nj|‘L|v;Ks?K>Ô .?} 8`OFZ"B T`No6Y*ؤBw60_Vk:J{vreSP}Y^{߻4IENDB` d yf YN PNG  IHDR5T pHYsN N } OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F&IDATxڌMN@ D,XpĢ ,T!ҤټH3ɶY(;iT@ XKk0H#0Eت(ҜdJxa~<-IN6y^5Z>qC$grZx~Z  S x@)#pl&k |(Qћ!R;:T UɰJ jU?j}Z  $j)d~}p'a {Nє H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FoIDATxڜn@E{3vDZUE*j,t@?e=#b*T*m{ ;8ع˙9s߽3uR@}9f+e}oU4y{hp c<:x,Ő,+d*{'U`#`) H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxڬnAFw(E $ހ@-())RK1R̥,uwMr۬vΜo FreeTime 1.5 877c77f0-ceeb-11dc-95ff-0800200c9a66 (c) 2008 freetimemanager.com Time-tracking widget for Project Management tool FreeTime Manager. all full true true false @ hC Hg%<^BjD;lA O~BWtqk*SAw*8-d(ϘXBrae#hnaQw,|,K\k2F92SwY 0>` ! g" v#: X%W R&} P+ "/ 1 Y3 86 9< `=\ >| > ? l@ eA WB TC@ RDd E E AF F G H? XId +J J K AL L {M, NL Nm ~O 8P P (, }7 -%C HYN d^Z yf r Q \ g&rB}`ߔi8VtuE)))4Cf?]JwV6a-o=|" 0&Ac]ίy'    ++ I6 gDB M X c n y +$ MZ o Ҧ ڱ    * G! d0 Y     hCFreeTime.konDefault.pngMainCode.jsMainCode_copy--before--totally getting rid of txtTime.jsrefresh.pngResources/about_freetime.pngResources/Library/Library.jsResources/Library/LibraryShared.jsResources/Library/Yahoo/ArgumentNullException.v1.01.jsResources/Library/Yahoo/ArgumentOutOfRangeException.v1.01.jsResources/Library/Yahoo/Controls/Button.v1.01.jsResources/Library/Yahoo/Controls/CheckBox.v1.01.jsResources/Library/Yahoo/Controls/CheckBoxBase.v1.01.jsResources/Library/Yahoo/Controls/CheckedListBox.v1.01.jsResources/Library/Yahoo/Controls/ComboBox.v1.01.jsResources/Library/Yahoo/Controls/Control.v1.01.jsResources/Library/Yahoo/Controls/Form.v1.01.jsResources/Library/Yahoo/Controls/ImageButton.v1.01.jsResources/Library/Yahoo/Controls/ImageComboBox.v1.01.jsResources/Library/Yahoo/Controls/Label.v1.01.jsResources/Library/Yahoo/Controls/ProgressBar.v1.01.jsResources/Library/Yahoo/Controls/Sizable3PartControlBase.v1.01.jsResources/Library/Yahoo/Controls/SizableControlBase.v1.01.jsResources/Library/Yahoo/Controls/TextBox.v1.01.jsResources/Library/Yahoo/Controls/Theme.v1.01.jsResources/Library/Yahoo/Controls/ThemeShared.v1.01.jsResources/Library/Yahoo/Drawing/Common.v1.01.jsResources/Library/Yahoo/Drawing/ContentAlignment.v1.01.jsResources/Library/Yahoo/EventArgs.v1.01.jsResources/Library/Yahoo/InvalidEnumArgumentException.v1.01.jsResources/Library/Yahoo/Utility/format.v1.01.jsResources/Library/Yahoo/Utility/Library.v1.01.jsResources/Library/Yahoo/Utility/LibraryShared.v1.01.jsResources/Library/Yahoo/Utility/stripHtml.v1.01.jsTheme/Black Glass/1x1Black.pngTheme/Black Glass/1x1Grey50.pngTheme/Black Glass/1x1Transp.pngTheme/Black Glass/1x1White.pngTheme/Black Glass/Black Glass.xmlTheme/Black Glass/ButtonLeft.pngTheme/Black Glass/ButtonMiddle.pngTheme/Black Glass/ButtonRight.pngTheme/Black Glass/CheckBoxBg.pngTheme/Black Glass/CheckBoxCheck.pngTheme/Black Glass/ComboBoxBB.pngTheme/Black Glass/ComboBoxBg.pngTheme/Black Glass/ComboBoxBL.pngTheme/Black Glass/ComboBoxBR.pngTheme/Black Glass/ComboBoxBT.pngTheme/Black Glass/ComboBoxBtn.pngTheme/Black Glass/ComboBoxCBL.pngTheme/Black Glass/ComboBoxCBR.pngTheme/Black Glass/ComboBoxCTL.pngTheme/Black Glass/ComboBoxCTR.pngTheme/Black Glass/FormBB.pngTheme/Black Glass/FormBg.pngTheme/Black Glass/FormBL.pngTheme/Black Glass/FormBR.pngTheme/Black Glass/FormBT.pngTheme/Black Glass/FormButtonClose.pngTheme/Black Glass/FormButtonMin.pngTheme/Black Glass/FormCBL.pngTheme/Black Glass/FormCBR.pngTheme/Black Glass/FormCTL.pngTheme/Black Glass/FormCTR.pngTheme/Black Glass/ImgCboButton.pngTheme/Black Glass/ListBoxBB.pngTheme/Black Glass/ListBoxBL.pngTheme/Black Glass/ListBoxBR.pngTheme/Black Glass/ListBoxBT.pngTheme/Black Glass/ListBoxCBL.pngTheme/Black Glass/ListBoxCBR.pngTheme/Black Glass/ListBoxCTL.pngTheme/Black Glass/ListBoxCTR.pngTheme/Black Glass/ProgressBarBB.pngTheme/Black Glass/ProgressBarBL.pngTheme/Black Glass/ProgressBarBR.pngTheme/Black Glass/ProgressBarBT.pngTheme/Black Glass/ProgressBarCBL.pngTheme/Black Glass/ProgressBarCBR.pngTheme/Black Glass/ProgressBarCTL.pngTheme/Black Glass/ProgressBarCTR.pngTheme/Black Glass/ProgressBarFill.pngTheme/Black Glass/StatusBarBG.pngTheme/Black Glass/TextBoxBB.pngTheme/Black Glass/TextBoxBg.pngTheme/Black Glass/TextBoxBL.pngTheme/Black Glass/TextBoxBR.pngTheme/Black Glass/TextBoxBT.pngTheme/Black Glass/TextBoxCBL.pngTheme/Black Glass/TextBoxCBR.pngTheme/Black Glass/TextBoxCTL.pngTheme/Black Glass/TextBoxCTR.pngTheme/FreeTime/1x1Black.pngTheme/FreeTime/1x1Grey50.pngTheme/FreeTime/1x1Transp.pngTheme/FreeTime/1x1White.pngTheme/FreeTime/ButtonLeft.pngTheme/FreeTime/ButtonMiddle.pngTheme/FreeTime/ButtonRight.pngTheme/FreeTime/CheckBoxBg.pngTheme/FreeTime/CheckBoxCheck.pngTheme/FreeTime/ComboBoxBB.pngTheme/FreeTime/ComboBoxBg.pngTheme/FreeTime/ComboBoxBL.pngTheme/FreeTime/ComboBoxBR.pngTheme/FreeTime/ComboBoxBT.pngTheme/FreeTime/ComboBoxBtn.pngTheme/FreeTime/ComboBoxCBL.pngTheme/FreeTime/ComboBoxCBR.pngTheme/FreeTime/ComboBoxCTL.pngTheme/FreeTime/ComboBoxCTR.pngTheme/FreeTime/FormBB.pngTheme/FreeTime/FormBg.pngTheme/FreeTime/FormBL.pngTheme/FreeTime/FormBR.pngTheme/FreeTime/FormBT.pngTheme/FreeTime/FormButtonClose.pngTheme/FreeTime/FormButtonMin.pngTheme/FreeTime/FormCBL.pngTheme/FreeTime/FormCBR.pngTheme/FreeTime/FormCTL.pngTheme/FreeTime/FormCTR.pngTheme/FreeTime/freetime.pngTheme/FreeTime/FreeTime.xmlTheme/FreeTime/ImgCboButton.pngTheme/FreeTime/ListBoxBB.pngTheme/FreeTime/ListBoxBL.pngTheme/FreeTime/ListBoxBR.pngTheme/FreeTime/ListBoxBT.pngTheme/FreeTime/ListBoxCBL.pngTheme/FreeTime/ListBoxCBR.pngTheme/FreeTime/ListBoxCTL.pngTheme/FreeTime/ListBoxCTR.pngTheme/FreeTime/ProgressBarBB.pngTheme/FreeTime/ProgressBarBL.pngTheme/FreeTime/ProgressBarBR.pngTheme/FreeTime/ProgressBarBT.pngTheme/FreeTime/ProgressBarCBL.pngTheme/FreeTime/ProgressBarCBR.pngTheme/FreeTime/ProgressBarCTL.pngTheme/FreeTime/ProgressBarCTR.pngTheme/FreeTime/ProgressBarFill.pngTheme/FreeTime/StatusBarBG.pngTheme/FreeTime/TextBoxBB.pngTheme/FreeTime/TextBoxBg.pngTheme/FreeTime/TextBoxBL.pngTheme/FreeTime/TextBoxBR.pngTheme/FreeTime/TextBoxBT.pngTheme/FreeTime/TextBoxCBL.pngTheme/FreeTime/TextBoxCBR.pngTheme/FreeTime/TextBoxCTL.pngTheme/FreeTime/TextBoxCTR.pngTheme/FreeTime/_FormBB.pngTheme/FreeTime/_FormBg.pngTheme/FreeTime/_FormBR.pngTheme/FreeTime/_FormBT.pngTheme/FreeTime/_FormCBL.pngTheme/FreeTime/_FormCBR.pngTheme/FreeTime/_FormCTL.pngTheme/FreeTime/_FormCTR.pngwidget.xml