diff --git a/addons/blogapi/conf/info.xml b/addons/blogapi/conf/info.xml index 040a54356..f9ad5589b 100644 --- a/addons/blogapi/conf/info.xml +++ b/addons/blogapi/conf/info.xml @@ -53,9 +53,9 @@ Этот blogApi аддон поддерживает metaWeblog. - Включая это опицией использовать, позволяет RSD тегу быть доступным для каждого модуля. + Используя этот аддон, RSD тег становится доступным для каждого модуля. URL для api - http://setup_path/module_name/api. - Только выбор опции использовать включает поведение RSD тега и api. + тег RSD и api работают только при включенном аддоне. 支援MetaWeblog的部落格API附加元件。 diff --git a/addons/captcha/captcha.addon.php b/addons/captcha/captcha.addon.php index be31532d6..b51a2eae5 100644 --- a/addons/captcha/captcha.addon.php +++ b/addons/captcha/captcha.addon.php @@ -21,6 +21,7 @@ $target_acts = array('procBoardInsertDocument','procBoardInsertComment','procIssuetrackerInsertIssue','procIssuetrackerInsertHistory','procTextyleInsertComment'); if($addon_info->apply_find_account=='apply') $target_acts[] = 'procMemberFindAccount'; if($addon_info->apply_resend_auth_mail=='apply') $target_acts[] = 'procMemberResendAuthMail'; + if($addon_info->apply_signup=='apply') $target_acts[] = 'procMemberInsert'; Context::addHtmlHeader(''); diff --git a/addons/captcha/conf/info.xml b/addons/captcha/conf/info.xml index 71a3409ef..c28903fc3 100644 --- a/addons/captcha/conf/info.xml +++ b/addons/captcha/conf/info.xml @@ -5,6 +5,7 @@ Captcha Addon 验证码插件 Captchaアドオン + Аддон Captcha 圖形驗證 프로그램 글 등록기를 막기 위해 게시판/ issueTracker에서 글/ 댓글을 입력하려 할 때 이미지를 보여주고 글에 해당하는 이미지를 선택하게 하는 애드온입니다. @@ -25,20 +26,25 @@ ボット(bot)がプログラムによるスパム行為を防ぐために、掲示板/issueTrackerで書き込み・コメントを登録する際、ランダムな文字や数字の列を画面に表示し、表示されたものと一致した情報を入力した時、登録が出来るようにするアドオンです。 ログインしてない時だけ、動作します。 + + + To block spam written by programs, let users to choose a suitable image to text when writing a posting or comment. + This addon applies only to not-logged-in users. 此元件可防止機器人程式的垃圾留言,非註冊用戶在討論板/問題追蹤發表主題或評論時,必須要先選對畫面中所顯示的圖案才能發表。 - 0.1 + 0.2 2009-02-20 - - zero - zero - zero - zero - zero - zero + + XE + XE + XE + XE + XE + XE + XE @@ -48,12 +54,14 @@ Captchaを表示する対象 選擇目標 Captcha Target + Captcha Target Mục tiêu Captcha hiển thị 글/댓글 등록시 captcha가 동작할 대상을 정할 수 있습니다. 관리자는 무조건 제외됩니다 可以指定验证码应用对象(管理员除外)。 管理者を除き、書き込み・コメントを入力する際にcaptchaイメージを見せる対象を設定します。 除了管理員,在發表主題或評論時,設定圖形驗證應用的對象。 You may specify targets CAPTCHA work. It's not applied when administrator writes. + You may specify targets CAPTCHA work. It's not applied when administrator writes. Khi gửi bài, bình luận, Capcha sẽ hiển thị để xác nhận hành động của người sử dụng. Chức năng này không hoạt động với người quản lý. 로그인하지 않은 사용자 @@ -61,6 +69,7 @@ ログインしてないユーザー 非用戶 Not logged-in users + Not logged-in users Người dùng chưa đăng nhập @@ -69,6 +78,7 @@ すべてのユーザー 所有用戶 All users + All users Tất cả mọi người @@ -78,12 +88,14 @@ 動作方式 行為模式 How it works + How it works Sử dụng "1번만 동작"을 선택하시면 1번만 동작후 상태를 저장해서 다음부터 물어보지 않고 그렇지 않으면 매번 물어보게 됩니다 "一次"就是每个IP只出现一次验证。 「1回だけ表示」を選択すると、最初だけ動作した後、その情報を記憶して次回からはCaptchaを見せないようにします。また、もう一つのオプションは毎回Captchaを表示します。 選擇"單次",產生第一次動作後,下次不會再顯示;選擇"每次"則會一直顯示。 If you choose "Once", CAPTCHA works only once for the user by storing status. Otherwise, this addon would show an image every time the user writes. + If you choose "Once", CAPTCHA works only once for the user by storing status. Otherwise, this addon would show an image every time the user writes. Nếu chọn "Chỉ một lần" thì sau lần hiển thị đó Capcha sẽ không hiển thị với người sử dụng đó nữa. 1번만 동작 @@ -92,6 +104,7 @@ 單次 Chỉ một lần once + 1 раз 매번 동작 @@ -99,6 +112,7 @@ 毎回表示 每次 every time + каждый раз Luôn sử dụng @@ -106,29 +120,33 @@ 비밀번호 찾기 적용 应用到查找密码功能 비밀번호 찾기 적용 - 비밀번호 찾기 적용 + 忘記密碼 applying to an action finding account + applying to an action finding account Khi lấy lại mật khẩu 적용으로 하시면 비밀번호 찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다. 启用此项功能可以有效地拦截以查找密码名义发送的垃圾邮件。 적용으로 하시면 비밀번호찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다. 적용으로 하시면 비밀번호찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다. If you set this option as apply, CAPTCHA will work for finding account action, too. + If you set this option as apply, CAPTCHA will work for finding account action, too. Nếu áp dụng, khi thành viên cần lấy lại mật khẩu khi lỡ quên, Capcha sẽ hiện thị để xác nhận việc này. 적용하지 않음 不启用 적용하지 않음 - 적용하지 않음 + 關閉 Not apply + Not apply Không áp dụng 적용 启用 적용 - 적용 + 開啟 Apply + Apply Áp dụng @@ -136,21 +154,58 @@ 인증 메일 재발송 적용 应用到认证邮件重新发送功能 인증 메일 재발송 적용 - 인증 메일 재발송 적용 + 重寄認證信 apply to an action resending authmail + apply to an action resending authmail Khi lấy lại mã kích hoạt 적용으로 하시면 인증 메일 재발송 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다. 启用此项功能可以有效地拦截以重新发送认证邮件名义发送的垃圾邮件。 적용으로 하시면 인증 메일 재발송 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다. 적용으로 하시면 인증 메일 재발송 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다. If you set this option as apply, CAPTCHA will work for resending authmail action, too. + If you set this option as apply, CAPTCHA will work for resending authmail action, too. Nếu áp dụng, khi thành viên cần lấy lại mã kích hoạt thành viên, Capcha sẽ hiện thị để xác nhận việc này. + + 적용하지 않음 + 不启用 + 적용하지 않음 + 關閉 + Not apply + Not apply + Không áp dụng + + + 적용 + 启用 + 적용 + 開啟 + Apply + Apply + Áp dụng + + + + 회원 가입 적용 + Apply to member signup + 인증 메일 재발송 적용 + 인증 메일 재발송 적용 + Apply to member signup + Apply to member signup + Apply to member signup + 적용으로 하시면 회원가입 기능에도 적용되어 악의적인 봇(또는 프로그램)의 회원가입을 막을 수 있습니다. + 적용으로 하시면 회원가입 기능에도 적용되어 악의적인 봇(또는 프로그램)의 회원가입을 막을 수 있습니다. + 적용으로 하시면 회원가입 기능에도 적용되어 악의적인 봇(또는 프로그램)의 회원가입을 막을 수 있습니다. + If you set this option as apply, CAPTCHA will work for signup action, too. + If you set this option as apply, CAPTCHA will work for signup action, too. + If you set this option as apply, CAPTCHA will work for signup action, too. + If you set this option as apply, CAPTCHA will work for signup action, too. 적용하지 않음 不启用 적용하지 않음 적용하지 않음 Not apply + Not apply Không áp dụng @@ -159,6 +214,7 @@ 적용 적용 Apply + Apply Áp dụng diff --git a/addons/captcha/lang/ru.lang.php b/addons/captcha/lang/ru.lang.php new file mode 100644 index 000000000..7106e8377 --- /dev/null +++ b/addons/captcha/lang/ru.lang.php @@ -0,0 +1,21 @@ +about_captcha = "Пожалуйста, выберите картинки, соответсвующие словам внизу"; + $lang->target_captcha = array( + "airplane" => "самолет", + "apple" => "яблоко", + "book" => "книга", + "camera" => "камера", + "dog" => "собака", + "earth" => "планета", + "flag" => "флаг", + "mobile" => "мобильный телефон", + "note" => "нота", + "skeleton" => "череп", + ); +?> diff --git a/addons/counter/conf/info.xml b/addons/counter/conf/info.xml index 83d011b36..ff3e54327 100644 --- a/addons/counter/conf/info.xml +++ b/addons/counter/conf/info.xml @@ -7,7 +7,7 @@ Counter Addon Counter Addon Addon contador básico - Аддон для базового счетчика + Аддон счетчика 網站訪問統計 XE의 기본 카운터 모듈을 이용하여 접속 정보를 기록합니다. diff --git a/addons/member_communication/conf/info.xml b/addons/member_communication/conf/info.xml index 261a47e5d..fe194c969 100644 --- a/addons/member_communication/conf/info.xml +++ b/addons/member_communication/conf/info.xml @@ -7,7 +7,7 @@ Truyền thông 커뮤니케이션 커뮤니케이션 - 커뮤니케이션 + Общение 交流 커뮤니케이션 모듈의 기능을 활성화 시켜 쪽지나 친구기능을 사용할 수 있도록 해줍니다. @@ -36,8 +36,7 @@ 쪽지, 친구기능등을 사용하기 위해서는 이 애드온을 사용으로 해주시면 됩니다. - 커뮤니케이션 모듈의 기능을 활성화 시켜 쪽지나 친구기능을 사용할 수 있도록 해줍니다. - 쪽지, 친구기능등을 사용하기 위해서는 이 애드온을 사용으로 해주시면 됩니다. + Активизирует модуль Общение, позволяет использование сообщений между друзьями. 讓會員擁有短訊和新增好友功能。 diff --git a/addons/member_communication/lang/ru.lang.php b/addons/member_communication/lang/ru.lang.php index 00bdc0231..80929bbad 100644 --- a/addons/member_communication/lang/ru.lang.php +++ b/addons/member_communication/lang/ru.lang.php @@ -5,5 +5,5 @@ * @brief Russian basic language pack **/ - $lang->alert_new_message_arrived = 'У Вас есть новые сообщения. Хотите проверить сейчас?'; + $lang->alert_new_message_arrived = 'У Вас новые сообщения. Проверите сейчас?'; ?> diff --git a/addons/member_extra_info/conf/info.xml b/addons/member_extra_info/conf/info.xml index 8618653d0..9e7ea28d5 100644 --- a/addons/member_extra_info/conf/info.xml +++ b/addons/member_extra_info/conf/info.xml @@ -7,7 +7,7 @@ Bổ xung thông tin thành viên 회원 확장 정보 출력 회원 확장 정보 출력 - 회원 확장 정보 출력 + Экстраинформация о пользователях 用戶延伸資料 회원이 등록한 이미지이름, 이미지마크를 사용하기 위해서는 이 애드온을 활성화 시키세요. @@ -31,7 +31,7 @@ This addon displays a member's image name, image mark. - This addon displays a member's image name, image mark. + Аддон изображает имя, марку картинки пользователя. 可將用戶資料中的暱稱圖片、用戶圖示、簽名檔等資料顯示到頁面當中。 diff --git a/addons/mobile/conf/info.xml b/addons/mobile/conf/info.xml index ac7b1bb37..4d63d00cf 100644 --- a/addons/mobile/conf/info.xml +++ b/addons/mobile/conf/info.xml @@ -5,6 +5,7 @@ 手机XE插件 Mobile XE Mobile XE + Mobile XE XE行動上網 모바일에서 접속시 헤더 정보를 분석하여 메뉴 - 모듈의 관계를 이용하여 WAP 태그로 출력하는 애드온입니다. @@ -25,6 +26,10 @@ Addon này hiển thị WAP Tag bởi việc phân tích thông tin khi kết nối bằng di động. Chỉ hỗ trợ cho các định dạng wml, hdml, mhtml. + + + Данный аддон показывает WAP теги, анализирую информацию мобильного соединения. + Поддерживаются только wml, hdml, mhtml форматы. 透過行動工具上網時,會將網頁轉換為WAP標籤顯示。 @@ -39,6 +44,7 @@ zero zero zero + zero zero @@ -49,6 +55,7 @@ misol misol misol + misol misol 언어선택 추가(WML, mHTML) @@ -63,6 +70,7 @@ 编码 Charset Charset + Charset 編碼 모바일 기기의 경우 UTF-8 문자셋을 인식하지 못할 수 있습니다. @@ -88,6 +96,11 @@ UTF-8 không thể đọc được cho các công cụ di động. Những công cụ di động sẽ trình bày Charset đúng khi bạn nhập vào Charset bạn muốn. Charset mặc định là UTF-8. + + + utf-8 may be read with mobile tools. + Mobile tools will display correct charset when you input charset you want. + Default charset is UTF-8. 行動工具無法讀取utf-8編碼。 diff --git a/addons/mobile/lang/ru.lang.php b/addons/mobile/lang/ru.lang.php new file mode 100644 index 000000000..768d186f8 --- /dev/null +++ b/addons/mobile/lang/ru.lang.php @@ -0,0 +1,17 @@ +president_lang = 'Дейсвующй язык'; + $lang->select_lang = 'Выбор языка'; + $lang->lang_return = 'Вернуться'; + + $lang->cmd_go_upper = 'Вверх'; + $lang->cmd_go_home = 'На главную страницу'; + $lang->cmd_view_sitemap = 'Посмотреть карту сайта'; + +?> diff --git a/addons/openid_delegation_id/conf/info.xml b/addons/openid_delegation_id/conf/info.xml index 5e645516d..887b18ee0 100644 --- a/addons/openid_delegation_id/conf/info.xml +++ b/addons/openid_delegation_id/conf/info.xml @@ -7,7 +7,7 @@ OpenID Delegation ID Delegación ID para OpenID OpenIDアドオン - Аддон для делигирования доменного имени к OpenID + Открытый ID(OpenID) OpenID 본인의 도메인을 사용하여 오픈아이디로 활용할 수 있도록 합니다. @@ -38,8 +38,8 @@ 必ず設定にて、OpenIDプロバイダーの関連情報を入力してから使用して下さい。 - Этот аддон позволяет Вам использовать Вашу доменное имя как OpenID. - Прежде, чем использовать, просто убедитесь, что установлены значения, имеющие отношение к провайдеру openid. + Этот аддон позволяет Вам использовать Ваше доменное имя как OpenID. + Прежде, чем использовать, установите значения, имеющие отношение к openid-провайдеру . 可將原本的域名當做OpenID來使用。 @@ -78,7 +78,7 @@ Bitte geben Sie Ihre openid.server Wert. Ingrese el valor del openid.server. openid.server値を入力して下さい。 - Пожалуйста, введите Ваше значение openid сервера. + Пожалуйста, введите Ваше значение openid.server 請輸入 openid.server 值。 @@ -98,7 +98,7 @@ Bitte geben Sie Ihre openid.delegate Wert. Ingresar el valor del openid.delegate openid.delegate値を入力して下さい。 - Пожалуйста, введите Ваше значение openid делегата. + Пожалуйста, введите Ваше значение openid.delegate 請輸入 openid.delegate 值。 diff --git a/addons/point_level_icon/conf/info.xml b/addons/point_level_icon/conf/info.xml index 5d64a7958..07c503216 100644 --- a/addons/point_level_icon/conf/info.xml +++ b/addons/point_level_icon/conf/info.xml @@ -7,7 +7,7 @@ Icon cấp độ của điểm Point-Level-Symbol Addon para mostar el nivel del ícono - Аддон для отображения иконки уровня + Иконка уровня поинтов 點數等級圖案 포인트 시스템을 사용중일 경우 사용자 이름 앞에 레벨 아이콘을 표시하도록 합니다. @@ -38,8 +38,8 @@ Tu puedes elegir los icono de cada nivel en el módulo > Sistema de Puntos. - Этот аддон отображает иконку уровня напротив имени пользователя, когда используется система поинтов. - Вы можете выбрать иконку уровня на Модуле Системы Поинтов. + Этот аддон отображает иконку уровня поинтов напротив имени пользователя, когда используется система поинтов. + Вы можете выбрать иконку уровня в Модуле Системы Поинтов. 使用點數系統時,可以在用戶名前顯示等級圖案。 diff --git a/addons/resize_image/conf/info.xml b/addons/resize_image/conf/info.xml index b417c294f..47f96b4f2 100644 --- a/addons/resize_image/conf/info.xml +++ b/addons/resize_image/conf/info.xml @@ -6,7 +6,7 @@ Image Resizer Thay đổi cỡ hình ảnh Imagen de control add-on bonmunnae - Image контроля добавить-на bonmunnae + Аддон редактирования размера картинки в тексте Image-Add-on bonmunnae 圖片縮放 @@ -28,7 +28,7 @@ La imagen corporal se inserta dentro del cuerpo para que se adapte al tamaño de la muestra original cuando hago clic en los add-ons. - Орган изображение вставляется внутрь тела с учетом размера первоначального шоу, когда я нажимаю на надстройки. + Аддон, изменяющий размер картинки к размеру текста, при клике на картинку, появляется полное изображение. Body Bild eingefügt im Inneren des Körpers zu passen die Größe des Originals zeigen, wenn ich darauf klicke auf das Add-ons. diff --git a/addons/smartphone/classes/smartphone.class.php b/addons/smartphone/classes/smartphone.class.php index c44db018a..9ac28d955 100644 --- a/addons/smartphone/classes/smartphone.class.php +++ b/addons/smartphone/classes/smartphone.class.php @@ -16,7 +16,7 @@ return false; } - return Context::get('smartphone') || preg_match('/(iPod|iPhone|SCH\-M[0-9]+)/',$_SERVER['HTTP_USER_AGENT']); + return Context::get('smartphone') || preg_match('/(iPod|iPhone|Android|SCH\-M[0-9]+)/',$_SERVER['HTTP_USER_AGENT']); } function haveSmartphoneModule($module) { @@ -80,7 +80,7 @@ } function procSmartPhone($msg = null) { - if(preg_match('/(iPod|iPhone)/',$_SERVER['HTTP_USER_AGENT'])) { + if(preg_match('/(iPod|iPhone|Android)/',$_SERVER['HTTP_USER_AGENT'])) { Context::addHtmlHeader(''); } else if(preg_match('/SCH\-M[0-9]+/',$_SERVER['HTTP_USER_AGENT'])) { Context::addHtmlHeader(''); diff --git a/addons/smartphone/conf/info.xml b/addons/smartphone/conf/info.xml index e0268a029..9412e35d4 100644 --- a/addons/smartphone/conf/info.xml +++ b/addons/smartphone/conf/info.xml @@ -4,6 +4,7 @@ SmartPhone XE 智能手机XE插件 SmartPhone XE + SmartPhone XE SmartPhone XE SmartPhone XE アドオン @@ -20,6 +21,9 @@ 用iPhone(touch)和智慧型手機瀏覽時會以最適當的畫面顯示。 + + + This addon displays the best screen for users who use smartphones like IPhone (touch). IPhone(touch)など、スマートフォンからアクセスした時、最適化されたインターフェースで表示させます。 @@ -32,6 +36,7 @@ haneul haneul haneul + haneul haneul diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php index a267ecd96..b6a2b85a3 100644 --- a/classes/context/Context.class.php +++ b/classes/context/Context.class.php @@ -509,6 +509,7 @@ **/ function _loadLang($path) { global $lang; + if(!is_object($lang)) $lang = new stdClass; if(!$this->lang_type) return; if(substr($path,-1)!='/') $path .= '/'; $filename = sprintf('%s%s.lang.php', $path, $this->lang_type); @@ -1520,5 +1521,40 @@ $oContext = &Context::getInstance(); return $oContext->allow_rewrite; } + + /** + * @brief 로컬 경로를 웹 경로로 변경 + */ + function pathToUrl($path) { + $xe = _XE_PATH_; + $path = strtr($path, "\\", "/"); + + $base_url = preg_replace('@^https?://[^/]+/+@', '', Context::getDefaultUrl()); + + $_xe = explode('/', $xe); + $_path = explode('/', $path); + $_base = explode('/', $base_url); + + if (!$_base[count($_base)-1]) array_pop($_base); + + foreach($_xe as $idx=>$dir) { + if($_path[0] != $dir) break; + array_shift($_path); + } + + $idx = count($_xe) - $idx - 1; + while($idx--) { + if (count($_base)) array_shift($_base); + else array_unshift($_base, '..'); + } + + if (count($_base)) { + array_unshift($_path, implode('/', $_base)); + } + + $path = '/'.implode('/', $_path); + + return $path; + } } ?> diff --git a/classes/db/DBCubrid.class.php b/classes/db/DBCubrid.class.php index 65f0075e1..4bfc4bf32 100644 --- a/classes/db/DBCubrid.class.php +++ b/classes/db/DBCubrid.class.php @@ -506,7 +506,7 @@ $name = $val['name']; $value = $val['value']; - if(substr($value,-2)!='+1') $check_click_count = false; + if(substr($value,-2)!='+1' || $output->column_type[$name]!='number') $check_click_count = false; for ($i = 0; $i < $key; $i++) { // 한문장에 같은 속성에 대한 중복 설정은 큐브리드에서는 허용치 않음 if ($output->columns[$i]['name'] == $name) break; diff --git a/classes/mail/Mail.class.php b/classes/mail/Mail.class.php index 7a4712528..e0fe0becc 100644 --- a/classes/mail/Mail.class.php +++ b/classes/mail/Mail.class.php @@ -43,7 +43,7 @@ } function getSender() { - if($this->sender_name) return sprintf("%s <%s>", '=?utf-8?b?'.base64_encode($this->sender_name).'?=', $this->sender_email); + if(!stristr(PHP_OS, 'win') && $this->sender_name) return sprintf("%s <%s>", '=?utf-8?b?'.base64_encode($this->sender_name).'?=', $this->sender_email); return $this->sender_email; } @@ -53,7 +53,7 @@ } function getReceiptor() { - if($this->receiptor_name && $this->receiptor_name != $this->receiptor_email) return sprintf("%s <%s>", '=?utf-8?b?'.base64_encode($this->receiptor_name).'?=', $this->receiptor_email); + if(!stristr(PHP_OS, 'win') && $this->receiptor_name && $this->receiptor_name != $this->receiptor_email) return sprintf("%s <%s>", '=?utf-8?b?'.base64_encode($this->receiptor_name).'?=', $this->receiptor_email); return $this->receiptor_email; } diff --git a/common/js/common.js b/common/js/common.js index caf9fac93..eef178ccd 100644 --- a/common/js/common.js +++ b/common/js/common.js @@ -248,6 +248,19 @@ jQuery(function($) { }); } + + /* 단락에디터 fold 컴포넌트 펼치기/접기 */ + var drEditorFold = $('.xe_content .fold_button'); + if(drEditorFold.size()) { + var fold_container = $('div.fold_container', drEditorFold); + $('button.more', drEditorFold).click(function() { + $(this).hide().next('button').show().parent().next(fold_container).show(); + }); + $('button.less', drEditorFold).click(function() { + $(this).hide().prev('button').show().parent().next(fold_container).hide(); + }); + } + }); @@ -980,7 +993,9 @@ jQuery(function(){ function() { var objText = jQuery(this); - var targetName = objText.attr("name"); + var targetName = objText.attr("id"); + if(typeof(targetName) == "undefined") targetName = objText.attr("name"); + if(typeof(targetName) == "undefined") return; objText.after("find_langcode"); } ); diff --git a/common/js/jquery-1.4.2-full.js b/common/js/jquery-1.4.2-full.js new file mode 100644 index 000000000..870d9ccaa --- /dev/null +++ b/common/js/jquery-1.4.2-full.js @@ -0,0 +1,6244 @@ +/*! + * jQuery JavaScript Library v1.4.2 + * http://jquery.com/ + * + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2010, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Sat Feb 13 22:33:48 2010 -0500 + */ +(function( window, undefined ) { + +// Define a local copy of jQuery +var jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context ); + }, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // Use the correct document accordingly with window argument (sandbox) + document = window.document, + + // A central reference to the root jQuery(document) + rootjQuery, + + // A simple way to check for HTML strings or ID strings + // (both of which we optimize for) + quickExpr = /^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/, + + // Is it a simple selector + isSimple = /^.[^:#\[\.,]*$/, + + // Check if a string has a non-whitespace character in it + rnotwhite = /\S/, + + // Used for trimming whitespace + rtrim = /^(\s|\u00A0)+|(\s|\u00A0)+$/g, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, + + // Keep a UserAgent string for use with jQuery.browser + userAgent = navigator.userAgent, + + // For matching the engine and version of the browser + browserMatch, + + // Has the ready events already been bound? + readyBound = false, + + // The functions to execute on DOM ready + readyList = [], + + // The ready event handler + DOMContentLoaded, + + // Save a reference to some core methods + toString = Object.prototype.toString, + hasOwnProperty = Object.prototype.hasOwnProperty, + push = Array.prototype.push, + slice = Array.prototype.slice, + indexOf = Array.prototype.indexOf; + +jQuery.fn = jQuery.prototype = { + init: function( selector, context ) { + var match, elem, ret, doc; + + // Handle $(""), $(null), or $(undefined) + if ( !selector ) { + return this; + } + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + } + + // The body element only exists once, optimize finding it + if ( selector === "body" && !context ) { + this.context = document; + this[0] = document.body; + this.selector = "body"; + this.length = 1; + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + match = quickExpr.exec( selector ); + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + doc = (context ? context.ownerDocument || context : document); + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + ret = rsingleTag.exec( selector ); + + if ( ret ) { + if ( jQuery.isPlainObject( context ) ) { + selector = [ document.createElement( ret[1] ) ]; + jQuery.fn.attr.call( selector, context, true ); + + } else { + selector = [ doc.createElement( ret[1] ) ]; + } + + } else { + ret = buildFragment( [ match[1] ], [ doc ] ); + selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes; + } + + return jQuery.merge( this, selector ); + + // HANDLE: $("#id") + } else { + elem = document.getElementById( match[2] ); + + if ( elem ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $("TAG") + } else if ( !context && /^\w+$/.test( selector ) ) { + this.selector = selector; + this.context = document; + selector = document.getElementsByTagName( selector ); + return jQuery.merge( this, selector ); + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return (context || rootjQuery).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return jQuery( context ).find( selector ); + } + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if (selector.selector !== undefined) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.4.2", + + // The default length of a jQuery object is 0 + length: 0, + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + toArray: function() { + return slice.call( this, 0 ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this.slice(num)[ 0 ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = jQuery(); + + if ( jQuery.isArray( elems ) ) { + push.apply( ret, elems ); + + } else { + jQuery.merge( ret, elems ); + } + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) { + ret.selector = this.selector + (this.selector ? " " : "") + selector; + } else if ( name ) { + ret.selector = this.selector + "." + name + "(" + selector + ")"; + } + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Attach the listeners + jQuery.bindReady(); + + // If the DOM is already ready + if ( jQuery.isReady ) { + // Execute the function immediately + fn.call( document, jQuery ); + + // Otherwise, remember the function for later + } else if ( readyList ) { + // Add the function to the wait list + readyList.push( fn ); + } + + return this; + }, + + eq: function( i ) { + return i === -1 ? + this.slice( i ) : + this.slice( i, +i + 1 ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ), + "slice", slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || jQuery(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + // copy reference to target object + var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging object literal values or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || jQuery.isArray(copy) ) ) { + var clone = src && ( jQuery.isPlainObject(src) || jQuery.isArray(src) ) ? src + : jQuery.isArray(copy) ? [] : {}; + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function( deep ) { + window.$ = _$; + + if ( deep ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // Handle when the DOM is ready + ready: function() { + // Make sure that the DOM is not already loaded + if ( !jQuery.isReady ) { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready, 13 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If there are functions bound, to execute + if ( readyList ) { + // Execute all of them + var fn, i = 0; + while ( (fn = readyList[ i++ ]) ) { + fn.call( document, jQuery ); + } + + // Reset the list of functions + readyList = null; + } + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + } + } + }, + + bindReady: function() { + if ( readyBound ) { + return; + } + + readyBound = true; + + // Catch cases where $(document).ready() is called after the + // browser event has already occurred. + if ( document.readyState === "complete" ) { + return jQuery.ready(); + } + + // Mozilla, Opera and webkit nightlies currently support this event + if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", jQuery.ready, false ); + + // If IE event model is used + } else if ( document.attachEvent ) { + // ensure firing before onload, + // maybe late but safe also for iframes + document.attachEvent("onreadystatechange", DOMContentLoaded); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", jQuery.ready ); + + // If IE and not a frame + // continually check to see if the document is ready + var toplevel = false; + + try { + toplevel = window.frameElement == null; + } catch(e) {} + + if ( document.documentElement.doScroll && toplevel ) { + doScrollCheck(); + } + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return toString.call(obj) === "[object Function]"; + }, + + isArray: function( obj ) { + return toString.call(obj) === "[object Array]"; + }, + + isPlainObject: function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || toString.call(obj) !== "[object Object]" || obj.nodeType || obj.setInterval ) { + return false; + } + + // Not own constructor property must be Object + if ( obj.constructor + && !hasOwnProperty.call(obj, "constructor") + && !hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var key; + for ( key in obj ) {} + + return key === undefined || hasOwnProperty.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + for ( var name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw msg; + }, + + parseJSON: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( /^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@") + .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]") + .replace(/(?:^|:|,)(?:\s*\[)+/g, "")) ) { + + // Try to use the native JSON parser first + return window.JSON && window.JSON.parse ? + window.JSON.parse( data ) : + (new Function("return " + data))(); + + } else { + jQuery.error( "Invalid JSON: " + data ); + } + }, + + noop: function() {}, + + // Evalulates a script in a global context + globalEval: function( data ) { + if ( data && rnotwhite.test(data) ) { + // Inspired by code by Andrea Giammarchi + // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html + var head = document.getElementsByTagName("head")[0] || document.documentElement, + script = document.createElement("script"); + + script.type = "text/javascript"; + + if ( jQuery.support.scriptEval ) { + script.appendChild( document.createTextNode( data ) ); + } else { + script.text = data; + } + + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709). + head.insertBefore( script, head.firstChild ); + head.removeChild( script ); + } + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, + length = object.length, + isObj = length === undefined || jQuery.isFunction(object); + + if ( args ) { + if ( isObj ) { + for ( name in object ) { + if ( callback.apply( object[ name ], args ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.apply( object[ i++ ], args ) === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isObj ) { + for ( name in object ) { + if ( callback.call( object[ name ], name, object[ name ] ) === false ) { + break; + } + } + } else { + for ( var value = object[0]; + i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {} + } + } + + return object; + }, + + trim: function( text ) { + return (text || "").replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( array, results ) { + var ret = results || []; + + if ( array != null ) { + // The window, strings (and functions) also have 'length' + // The extra typeof function check is to prevent crashes + // in Safari 2 (See: #3039) + if ( array.length == null || typeof array === "string" || jQuery.isFunction(array) || (typeof array !== "function" && array.setInterval) ) { + push.call( ret, array ); + } else { + jQuery.merge( ret, array ); + } + } + + return ret; + }, + + inArray: function( elem, array ) { + if ( array.indexOf ) { + return array.indexOf( elem ); + } + + for ( var i = 0, length = array.length; i < length; i++ ) { + if ( array[ i ] === elem ) { + return i; + } + } + + return -1; + }, + + merge: function( first, second ) { + var i = first.length, j = 0; + + if ( typeof second.length === "number" ) { + for ( var l = second.length; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var ret = []; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, length = elems.length; i < length; i++ ) { + if ( !inv !== !callback( elems[ i ], i ) ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var ret = [], value; + + // Go through the array, translating each of the items to their + // new value (or values). + for ( var i = 0, length = elems.length; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + return ret.concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + proxy: function( fn, proxy, thisObject ) { + if ( arguments.length === 2 ) { + if ( typeof proxy === "string" ) { + thisObject = fn; + fn = thisObject[ proxy ]; + proxy = undefined; + + } else if ( proxy && !jQuery.isFunction( proxy ) ) { + thisObject = proxy; + proxy = undefined; + } + } + + if ( !proxy && fn ) { + proxy = function() { + return fn.apply( thisObject || this, arguments ); + }; + } + + // Set the guid of unique handler to the same of original handler, so it can be removed + if ( fn ) { + proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + } + + // So proxy can be declared as an argument + return proxy; + }, + + // Use of jQuery.browser is frowned upon. + // More details: http://docs.jquery.com/Utilities/jQuery.browser + uaMatch: function( ua ) { + ua = ua.toLowerCase(); + + var match = /(webkit)[ \/]([\w.]+)/.exec( ua ) || + /(opera)(?:.*version)?[ \/]([\w.]+)/.exec( ua ) || + /(msie) ([\w.]+)/.exec( ua ) || + !/compatible/.test( ua ) && /(mozilla)(?:.*? rv:([\w.]+))?/.exec( ua ) || + []; + + return { browser: match[1] || "", version: match[2] || "0" }; + }, + + browser: {} +}); + +browserMatch = jQuery.uaMatch( userAgent ); +if ( browserMatch.browser ) { + jQuery.browser[ browserMatch.browser ] = true; + jQuery.browser.version = browserMatch.version; +} + +// Deprecated, use jQuery.browser.webkit instead +if ( jQuery.browser.webkit ) { + jQuery.browser.safari = true; +} + +if ( indexOf ) { + jQuery.inArray = function( elem, array ) { + return indexOf.call( array, elem ); + }; +} + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); + +// Cleanup functions for the document ready method +if ( document.addEventListener ) { + DOMContentLoaded = function() { + document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + jQuery.ready(); + }; + +} else if ( document.attachEvent ) { + DOMContentLoaded = function() { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( document.readyState === "complete" ) { + document.detachEvent( "onreadystatechange", DOMContentLoaded ); + jQuery.ready(); + } + }; +} + +// The DOM ready check for Internet Explorer +function doScrollCheck() { + if ( jQuery.isReady ) { + return; + } + + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch( error ) { + setTimeout( doScrollCheck, 1 ); + return; + } + + // and execute any waiting functions + jQuery.ready(); +} + +function evalScript( i, elem ) { + if ( elem.src ) { + jQuery.ajax({ + url: elem.src, + async: false, + dataType: "script" + }); + } else { + jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); + } + + if ( elem.parentNode ) { + elem.parentNode.removeChild( elem ); + } +} + +// Mutifunctional method to get and set values to a collection +// The value/s can be optionally by executed if its a function +function access( elems, key, value, exec, fn, pass ) { + var length = elems.length; + + // Setting many attributes + if ( typeof key === "object" ) { + for ( var k in key ) { + access( elems, k, key[k], exec, fn, value ); + } + return elems; + } + + // Setting one attribute + if ( value !== undefined ) { + // Optionally, function values get executed if exec is true + exec = !pass && exec && jQuery.isFunction(value); + + for ( var i = 0; i < length; i++ ) { + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); + } + + return elems; + } + + // Getting an attribute + return length ? fn( elems[0], key ) : undefined; +} + +function now() { + return (new Date).getTime(); +} +(function() { + + jQuery.support = {}; + + var root = document.documentElement, + script = document.createElement("script"), + div = document.createElement("div"), + id = "script" + now(); + + div.style.display = "none"; + div.innerHTML = "
a"; + + var all = div.getElementsByTagName("*"), + a = div.getElementsByTagName("a")[0]; + + // Can't get basic test support + if ( !all || !all.length || !a ) { + return; + } + + jQuery.support = { + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: div.firstChild.nodeType === 3, + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName("tbody").length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName("link").length, + + // Get the style information from getAttribute + // (IE uses .cssText insted) + style: /red/.test( a.getAttribute("style") ), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: a.getAttribute("href") === "/a", + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.55$/.test( a.style.opacity ), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: div.getElementsByTagName("input")[0].value === "on", + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: document.createElement("select").appendChild( document.createElement("option") ).selected, + + parentNode: div.removeChild( div.appendChild( document.createElement("div") ) ).parentNode === null, + + // Will be defined later + deleteExpando: true, + checkClone: false, + scriptEval: false, + noCloneEvent: true, + boxModel: null + }; + + script.type = "text/javascript"; + try { + script.appendChild( document.createTextNode( "window." + id + "=1;" ) ); + } catch(e) {} + + root.insertBefore( script, root.firstChild ); + + // Make sure that the execution of code works by injecting a script + // tag with appendChild/createTextNode + // (IE doesn't support this, fails, and uses .text instead) + if ( window[ id ] ) { + jQuery.support.scriptEval = true; + delete window[ id ]; + } + + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete script.test; + + } catch(e) { + jQuery.support.deleteExpando = false; + } + + root.removeChild( script ); + + if ( div.attachEvent && div.fireEvent ) { + div.attachEvent("onclick", function click() { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + jQuery.support.noCloneEvent = false; + div.detachEvent("onclick", click); + }); + div.cloneNode(true).fireEvent("onclick"); + } + + div = document.createElement("div"); + div.innerHTML = ""; + + var fragment = document.createDocumentFragment(); + fragment.appendChild( div.firstChild ); + + // WebKit doesn't clone checked state correctly in fragments + jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked; + + // Figure out if the W3C box model works as expected + // document.body must exist before we can do this + jQuery(function() { + var div = document.createElement("div"); + div.style.width = div.style.paddingLeft = "1px"; + + document.body.appendChild( div ); + jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2; + document.body.removeChild( div ).style.display = 'none'; + + div = null; + }); + + // Technique from Juriy Zaytsev + // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ + var eventSupported = function( eventName ) { + var el = document.createElement("div"); + eventName = "on" + eventName; + + var isSupported = (eventName in el); + if ( !isSupported ) { + el.setAttribute(eventName, "return;"); + isSupported = typeof el[eventName] === "function"; + } + el = null; + + return isSupported; + }; + + jQuery.support.submitBubbles = eventSupported("submit"); + jQuery.support.changeBubbles = eventSupported("change"); + + // release memory in IE + root = script = div = all = a = null; +})(); + +jQuery.props = { + "for": "htmlFor", + "class": "className", + readonly: "readOnly", + maxlength: "maxLength", + cellspacing: "cellSpacing", + rowspan: "rowSpan", + colspan: "colSpan", + tabindex: "tabIndex", + usemap: "useMap", + frameborder: "frameBorder" +}; +var expando = "jQuery" + now(), uuid = 0, windowData = {}; + +jQuery.extend({ + cache: {}, + + expando:expando, + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + "object": true, + "applet": true + }, + + data: function( elem, name, data ) { + if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) { + return; + } + + elem = elem == window ? + windowData : + elem; + + var id = elem[ expando ], cache = jQuery.cache, thisCache; + + if ( !id && typeof name === "string" && data === undefined ) { + return null; + } + + // Compute a unique ID for the element + if ( !id ) { + id = ++uuid; + } + + // Avoid generating a new cache unless none exists and we + // want to manipulate it. + if ( typeof name === "object" ) { + elem[ expando ] = id; + thisCache = cache[ id ] = jQuery.extend(true, {}, name); + + } else if ( !cache[ id ] ) { + elem[ expando ] = id; + cache[ id ] = {}; + } + + thisCache = cache[ id ]; + + // Prevent overriding the named cache with undefined values + if ( data !== undefined ) { + thisCache[ name ] = data; + } + + return typeof name === "string" ? thisCache[ name ] : thisCache; + }, + + removeData: function( elem, name ) { + if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) { + return; + } + + elem = elem == window ? + windowData : + elem; + + var id = elem[ expando ], cache = jQuery.cache, thisCache = cache[ id ]; + + // If we want to remove a specific section of the element's data + if ( name ) { + if ( thisCache ) { + // Remove the section of cache data + delete thisCache[ name ]; + + // If we've removed all the data, remove the element's cache + if ( jQuery.isEmptyObject(thisCache) ) { + jQuery.removeData( elem ); + } + } + + // Otherwise, we want to remove all of the element's data + } else { + if ( jQuery.support.deleteExpando ) { + delete elem[ jQuery.expando ]; + + } else if ( elem.removeAttribute ) { + elem.removeAttribute( jQuery.expando ); + } + + // Completely remove the data cache + delete cache[ id ]; + } + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + if ( typeof key === "undefined" && this.length ) { + return jQuery.data( this[0] ); + + } else if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + var parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + if ( data === undefined && this.length ) { + data = jQuery.data( this[0], key ); + } + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + } else { + return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function() { + jQuery.data( this, key, value ); + }); + } + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); +jQuery.extend({ + queue: function( elem, type, data ) { + if ( !elem ) { + return; + } + + type = (type || "fx") + "queue"; + var q = jQuery.data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( !data ) { + return q || []; + } + + if ( !q || jQuery.isArray(data) ) { + q = jQuery.data( elem, type, jQuery.makeArray(data) ); + + } else { + q.push( data ); + } + + return q; + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), fn = queue.shift(); + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + } + + if ( fn ) { + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift("inprogress"); + } + + fn.call(elem, function() { + jQuery.dequeue(elem, type); + }); + } + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + } + + if ( data === undefined ) { + return jQuery.queue( this[0], type ); + } + return this.each(function( i, elem ) { + var queue = jQuery.queue( this, type, data ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; + type = type || "fx"; + + return this.queue( type, function() { + var elem = this; + setTimeout(function() { + jQuery.dequeue( elem, type ); + }, time ); + }); + }, + + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + } +}); +var rclass = /[\n\t]/g, + rspace = /\s+/, + rreturn = /\r/g, + rspecialurl = /href|src|style/, + rtype = /(button|input)/i, + rfocusable = /(button|input|object|select|textarea)/i, + rclickable = /^(a|area)$/i, + rradiocheck = /radio|checkbox/; + +jQuery.fn.extend({ + attr: function( name, value ) { + return access( this, name, value, true, jQuery.attr ); + }, + + removeAttr: function( name, fn ) { + return this.each(function(){ + jQuery.attr( this, name, "" ); + if ( this.nodeType === 1 ) { + this.removeAttribute( name ); + } + }); + }, + + addClass: function( value ) { + if ( jQuery.isFunction(value) ) { + return this.each(function(i) { + var self = jQuery(this); + self.addClass( value.call(this, i, self.attr("class")) ); + }); + } + + if ( value && typeof value === "string" ) { + var classNames = (value || "").split( rspace ); + + for ( var i = 0, l = this.length; i < l; i++ ) { + var elem = this[i]; + + if ( elem.nodeType === 1 ) { + if ( !elem.className ) { + elem.className = value; + + } else { + var className = " " + elem.className + " ", setClass = elem.className; + for ( var c = 0, cl = classNames.length; c < cl; c++ ) { + if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) { + setClass += " " + classNames[c]; + } + } + elem.className = jQuery.trim( setClass ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + if ( jQuery.isFunction(value) ) { + return this.each(function(i) { + var self = jQuery(this); + self.removeClass( value.call(this, i, self.attr("class")) ); + }); + } + + if ( (value && typeof value === "string") || value === undefined ) { + var classNames = (value || "").split(rspace); + + for ( var i = 0, l = this.length; i < l; i++ ) { + var elem = this[i]; + + if ( elem.nodeType === 1 && elem.className ) { + if ( value ) { + var className = (" " + elem.className + " ").replace(rclass, " "); + for ( var c = 0, cl = classNames.length; c < cl; c++ ) { + className = className.replace(" " + classNames[c] + " ", " "); + } + elem.className = jQuery.trim( className ); + + } else { + elem.className = ""; + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, isBool = typeof stateVal === "boolean"; + + if ( jQuery.isFunction( value ) ) { + return this.each(function(i) { + var self = jQuery(this); + self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, i = 0, self = jQuery(this), + state = stateVal, + classNames = value.split( rspace ); + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space seperated list + state = isBool ? state : !self.hasClass( className ); + self[ state ? "addClass" : "removeClass" ]( className ); + } + + } else if ( type === "undefined" || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery.data( this, "__className__", this.className ); + } + + // toggle whole className + this.className = this.className || value === false ? "" : jQuery.data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " "; + for ( var i = 0, l = this.length; i < l; i++ ) { + if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + if ( value === undefined ) { + var elem = this[0]; + + if ( elem ) { + if ( jQuery.nodeName( elem, "option" ) ) { + return (elem.attributes.value || {}).specified ? elem.value : elem.text; + } + + // We need to handle select boxes special + if ( jQuery.nodeName( elem, "select" ) ) { + var index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type === "select-one"; + + // Nothing was selected + if ( index < 0 ) { + return null; + } + + // Loop through all the selected options + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { + var option = options[ i ]; + + if ( option.selected ) { + // Get the specifc value for the option + value = jQuery(option).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + } + + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) { + return elem.getAttribute("value") === null ? "on" : elem.value; + } + + + // Everything else, we just grab the value + return (elem.value || "").replace(rreturn, ""); + + } + + return undefined; + } + + var isFunction = jQuery.isFunction(value); + + return this.each(function(i) { + var self = jQuery(this), val = value; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call(this, i, self.val()); + } + + // Typecast each time if the value is a Function and the appended + // value is therefore different each time. + if ( typeof val === "number" ) { + val += ""; + } + + if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) { + this.checked = jQuery.inArray( self.val(), val ) >= 0; + + } else if ( jQuery.nodeName( this, "select" ) ) { + var values = jQuery.makeArray(val); + + jQuery( "option", this ).each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + this.selectedIndex = -1; + } + + } else { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + attrFn: { + val: true, + css: true, + html: true, + text: true, + data: true, + width: true, + height: true, + offset: true + }, + + attr: function( elem, name, value, pass ) { + // don't set attributes on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) { + return undefined; + } + + if ( pass && name in jQuery.attrFn ) { + return jQuery(elem)[name](value); + } + + var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ), + // Whether we are setting (or getting) + set = value !== undefined; + + // Try to normalize/fix the name + name = notxml && jQuery.props[ name ] || name; + + // Only do all the following if this is a node (faster for style) + if ( elem.nodeType === 1 ) { + // These attributes require special treatment + var special = rspecialurl.test( name ); + + // Safari mis-reports the default selected property of an option + // Accessing the parent's selectedIndex property fixes it + if ( name === "selected" && !jQuery.support.optSelected ) { + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + + // If applicable, access the attribute via the DOM 0 way + if ( name in elem && notxml && !special ) { + if ( set ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } + + elem[ name ] = value; + } + + // browsers index elements by id/name on forms, give priority to attributes. + if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) { + return elem.getAttributeNode( name ).nodeValue; + } + + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + if ( name === "tabIndex" ) { + var attributeNode = elem.getAttributeNode( "tabIndex" ); + + return attributeNode && attributeNode.specified ? + attributeNode.value : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + + return elem[ name ]; + } + + if ( !jQuery.support.style && notxml && name === "style" ) { + if ( set ) { + elem.style.cssText = "" + value; + } + + return elem.style.cssText; + } + + if ( set ) { + // convert the value to a string (all browsers do this but IE) see #1070 + elem.setAttribute( name, "" + value ); + } + + var attr = !jQuery.support.hrefNormalized && notxml && special ? + // Some attributes require a special call on IE + elem.getAttribute( name, 2 ) : + elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return attr === null ? undefined : attr; + } + + // elem is actually elem.style ... set the style + // Using attr for specific style information is now deprecated. Use style instead. + return jQuery.style( elem, name, value ); + } +}); +var rnamespaces = /\.(.*)$/, + fcleanup = function( nm ) { + return nm.replace(/[^\w\s\.\|`]/g, function( ch ) { + return "\\" + ch; + }); + }; + +/* + * A number of helper functions used for managing events. + * Many of the ideas behind this code originated from + * Dean Edwards' addEvent library. + */ +jQuery.event = { + + // Bind an event to an element + // Original by Dean Edwards + add: function( elem, types, handler, data ) { + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // For whatever reason, IE has trouble passing the window object + // around, causing it to be cloned in the process + if ( elem.setInterval && ( elem !== window && !elem.frameElement ) ) { + elem = window; + } + + var handleObjIn, handleObj; + + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + } + + // Make sure that the function being executed has a unique ID + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure + var elemData = jQuery.data( elem ); + + // If no elemData is found then we must be trying to bind to one of the + // banned noData elements + if ( !elemData ) { + return; + } + + var events = elemData.events = elemData.events || {}, + eventHandle = elemData.handle, eventHandle; + + if ( !eventHandle ) { + elemData.handle = eventHandle = function() { + // Handle the second event of a trigger and when + // an event is called after a page has unloaded + return typeof jQuery !== "undefined" && !jQuery.event.triggered ? + jQuery.event.handle.apply( eventHandle.elem, arguments ) : + undefined; + }; + } + + // Add elem as a property of the handle function + // This is to prevent a memory leak with non-native events in IE. + eventHandle.elem = elem; + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = types.split(" "); + + var type, i = 0, namespaces; + + while ( (type = types[ i++ ]) ) { + handleObj = handleObjIn ? + jQuery.extend({}, handleObjIn) : + { handler: handler, data: data }; + + // Namespaced event handlers + if ( type.indexOf(".") > -1 ) { + namespaces = type.split("."); + type = namespaces.shift(); + handleObj.namespace = namespaces.slice(0).sort().join("."); + + } else { + namespaces = []; + handleObj.namespace = ""; + } + + handleObj.type = type; + handleObj.guid = handler.guid; + + // Get the current list of functions bound to this event + var handlers = events[ type ], + special = jQuery.event.special[ type ] || {}; + + // Init the event handler queue + if ( !handlers ) { + handlers = events[ type ] = []; + + // Check for a special event handler + // Only use addEventListener/attachEvent if the special + // events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add the function to the element's handler list + handlers.push( handleObj ); + + // Keep track of which events have been used, for global triggering + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + global: {}, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, pos ) { + // don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + var ret, type, fn, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, + elemData = jQuery.data( elem ), + events = elemData && elemData.events; + + if ( !elemData || !events ) { + return; + } + + // types is actually an event object here + if ( types && types.type ) { + handler = types.handler; + types = types.type; + } + + // Unbind all events for the element + if ( !types || typeof types === "string" && types.charAt(0) === "." ) { + types = types || ""; + + for ( type in events ) { + jQuery.event.remove( elem, type + types ); + } + + return; + } + + // Handle multiple events separated by a space + // jQuery(...).unbind("mouseover mouseout", fn); + types = types.split(" "); + + while ( (type = types[ i++ ]) ) { + origType = type; + handleObj = null; + all = type.indexOf(".") < 0; + namespaces = []; + + if ( !all ) { + // Namespaced event handlers + namespaces = type.split("."); + type = namespaces.shift(); + + namespace = new RegExp("(^|\\.)" + + jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)") + } + + eventType = events[ type ]; + + if ( !eventType ) { + continue; + } + + if ( !handler ) { + for ( var j = 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( all || namespace.test( handleObj.namespace ) ) { + jQuery.event.remove( elem, origType, handleObj.handler, j ); + eventType.splice( j--, 1 ); + } + } + + continue; + } + + special = jQuery.event.special[ type ] || {}; + + for ( var j = pos || 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( handler.guid === handleObj.guid ) { + // remove the given handler for the given type + if ( all || namespace.test( handleObj.namespace ) ) { + if ( pos == null ) { + eventType.splice( j--, 1 ); + } + + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + + if ( pos != null ) { + break; + } + } + } + + // remove generic event handler if no more handlers exist + if ( eventType.length === 0 || pos != null && eventType.length === 1 ) { + if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { + removeEvent( elem, type, elemData.handle ); + } + + ret = null; + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + var handle = elemData.handle; + if ( handle ) { + handle.elem = null; + } + + delete elemData.events; + delete elemData.handle; + + if ( jQuery.isEmptyObject( elemData ) ) { + jQuery.removeData( elem ); + } + } + }, + + // bubbling is internal + trigger: function( event, data, elem /*, bubbling */ ) { + // Event object or event type + var type = event.type || event, + bubbling = arguments[3]; + + if ( !bubbling ) { + event = typeof event === "object" ? + // jQuery.Event object + event[expando] ? event : + // Object literal + jQuery.extend( jQuery.Event(type), event ) : + // Just the event type (string) + jQuery.Event(type); + + if ( type.indexOf("!") >= 0 ) { + event.type = type = type.slice(0, -1); + event.exclusive = true; + } + + // Handle a global trigger + if ( !elem ) { + // Don't bubble custom events when global (to avoid too much overhead) + event.stopPropagation(); + + // Only trigger if we've ever bound an event for it + if ( jQuery.event.global[ type ] ) { + jQuery.each( jQuery.cache, function() { + if ( this.events && this.events[type] ) { + jQuery.event.trigger( event, data, this.handle.elem ); + } + }); + } + } + + // Handle triggering a single element + + // don't do events on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) { + return undefined; + } + + // Clean up in case it is reused + event.result = undefined; + event.target = elem; + + // Clone the incoming data, if any + data = jQuery.makeArray( data ); + data.unshift( event ); + } + + event.currentTarget = elem; + + // Trigger the event, it is assumed that "handle" is a function + var handle = jQuery.data( elem, "handle" ); + if ( handle ) { + handle.apply( elem, data ); + } + + var parent = elem.parentNode || elem.ownerDocument; + + // Trigger an inline bound script + try { + if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) { + if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) { + event.result = false; + } + } + + // prevent IE from throwing an error for some elements with some event types, see #3533 + } catch (e) {} + + if ( !event.isPropagationStopped() && parent ) { + jQuery.event.trigger( event, data, parent, true ); + + } else if ( !event.isDefaultPrevented() ) { + var target = event.target, old, + isClick = jQuery.nodeName(target, "a") && type === "click", + special = jQuery.event.special[ type ] || {}; + + if ( (!special._default || special._default.call( elem, event ) === false) && + !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) { + + try { + if ( target[ type ] ) { + // Make sure that we don't accidentally re-trigger the onFOO events + old = target[ "on" + type ]; + + if ( old ) { + target[ "on" + type ] = null; + } + + jQuery.event.triggered = true; + target[ type ](); + } + + // prevent IE from throwing an error for some elements with some event types, see #3533 + } catch (e) {} + + if ( old ) { + target[ "on" + type ] = old; + } + + jQuery.event.triggered = false; + } + } + }, + + handle: function( event ) { + var all, handlers, namespaces, namespace, events; + + event = arguments[0] = jQuery.event.fix( event || window.event ); + event.currentTarget = this; + + // Namespaced event handlers + all = event.type.indexOf(".") < 0 && !event.exclusive; + + if ( !all ) { + namespaces = event.type.split("."); + event.type = namespaces.shift(); + namespace = new RegExp("(^|\\.)" + namespaces.slice(0).sort().join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + var events = jQuery.data(this, "events"), handlers = events[ event.type ]; + + if ( events && handlers ) { + // Clone the handlers to prevent manipulation + handlers = handlers.slice(0); + + for ( var j = 0, l = handlers.length; j < l; j++ ) { + var handleObj = handlers[ j ]; + + // Filter the functions by class + if ( all || namespace.test( handleObj.namespace ) ) { + // Pass in a reference to the handler function itself + // So that we can later remove it + event.handler = handleObj.handler; + event.data = handleObj.data; + event.handleObj = handleObj; + + var ret = handleObj.handler.apply( this, arguments ); + + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + + if ( event.isImmediatePropagationStopped() ) { + break; + } + } + } + } + + return event.result; + }, + + props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), + + fix: function( event ) { + if ( event[ expando ] ) { + return event; + } + + // store a copy of the original event object + // and "clone" to set read-only properties + var originalEvent = event; + event = jQuery.Event( originalEvent ); + + for ( var i = this.props.length, prop; i; ) { + prop = this.props[ --i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Fix target property, if necessary + if ( !event.target ) { + event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either + } + + // check if target is a textnode (safari) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && event.fromElement ) { + event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement; + } + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && event.clientX != null ) { + var doc = document.documentElement, body = document.body; + event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); + event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); + } + + // Add which for key events + if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) ) { + event.which = event.charCode || event.keyCode; + } + + // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) + if ( !event.metaKey && event.ctrlKey ) { + event.metaKey = event.ctrlKey; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && event.button !== undefined ) { + event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); + } + + return event; + }, + + // Deprecated, use jQuery.guid instead + guid: 1E8, + + // Deprecated, use jQuery.proxy instead + proxy: jQuery.proxy, + + special: { + ready: { + // Make sure the ready event is setup + setup: jQuery.bindReady, + teardown: jQuery.noop + }, + + live: { + add: function( handleObj ) { + jQuery.event.add( this, handleObj.origType, jQuery.extend({}, handleObj, {handler: liveHandler}) ); + }, + + remove: function( handleObj ) { + var remove = true, + type = handleObj.origType.replace(rnamespaces, ""); + + jQuery.each( jQuery.data(this, "events").live || [], function() { + if ( type === this.origType.replace(rnamespaces, "") ) { + remove = false; + return false; + } + }); + + if ( remove ) { + jQuery.event.remove( this, handleObj.origType, liveHandler ); + } + } + + }, + + beforeunload: { + setup: function( data, namespaces, eventHandle ) { + // We only want to do this special case on windows + if ( this.setInterval ) { + this.onbeforeunload = eventHandle; + } + + return false; + }, + teardown: function( namespaces, eventHandle ) { + if ( this.onbeforeunload === eventHandle ) { + this.onbeforeunload = null; + } + } + } + } +}; + +var removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + elem.removeEventListener( type, handle, false ); + } : + function( elem, type, handle ) { + elem.detachEvent( "on" + type, handle ); + }; + +jQuery.Event = function( src ) { + // Allow instantiation without the 'new' keyword + if ( !this.preventDefault ) { + return new jQuery.Event( src ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + // Event type + } else { + this.type = src; + } + + // timeStamp is buggy for some events on Firefox(#3843) + // So we won't rely on the native value + this.timeStamp = now(); + + // Mark it as fixed + this[ expando ] = true; +}; + +function returnFalse() { + return false; +} +function returnTrue() { + return true; +} + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + preventDefault: function() { + this.isDefaultPrevented = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + + // if preventDefault exists run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + } + // otherwise set the returnValue property of the original event to false (IE) + e.returnValue = false; + }, + stopPropagation: function() { + this.isPropagationStopped = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + // if stopPropagation exists run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + // otherwise set the cancelBubble property of the original event to true (IE) + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse +}; + +// Checks if an event happened on an element within another element +// Used in jQuery.event.special.mouseenter and mouseleave handlers +var withinElement = function( event ) { + // Check if mouse(over|out) are still within the same parent element + var parent = event.relatedTarget; + + // Firefox sometimes assigns relatedTarget a XUL element + // which we cannot access the parentNode property of + try { + // Traverse up the tree + while ( parent && parent !== this ) { + parent = parent.parentNode; + } + + if ( parent !== this ) { + // set the correct event type + event.type = event.data; + + // handle event if we actually just moused on to a non sub-element + jQuery.event.handle.apply( this, arguments ); + } + + // assuming we've left the element since we most likely mousedover a xul element + } catch(e) { } +}, + +// In case of event delegation, we only need to rename the event.type, +// liveHandler will take care of the rest. +delegate = function( event ) { + event.type = event.data; + jQuery.event.handle.apply( this, arguments ); +}; + +// Create mouseenter and mouseleave events +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + setup: function( data ) { + jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig ); + }, + teardown: function( data ) { + jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement ); + } + }; +}); + +// submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function( data, namespaces ) { + if ( this.nodeName.toLowerCase() !== "form" ) { + jQuery.event.add(this, "click.specialSubmit", function( e ) { + var elem = e.target, type = elem.type; + + if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) { + return trigger( "submit", this, arguments ); + } + }); + + jQuery.event.add(this, "keypress.specialSubmit", function( e ) { + var elem = e.target, type = elem.type; + + if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) { + return trigger( "submit", this, arguments ); + } + }); + + } else { + return false; + } + }, + + teardown: function( namespaces ) { + jQuery.event.remove( this, ".specialSubmit" ); + } + }; + +} + +// change delegation, happens here so we have bind. +if ( !jQuery.support.changeBubbles ) { + + var formElems = /textarea|input|select/i, + + changeFilters, + + getVal = function( elem ) { + var type = elem.type, val = elem.value; + + if ( type === "radio" || type === "checkbox" ) { + val = elem.checked; + + } else if ( type === "select-multiple" ) { + val = elem.selectedIndex > -1 ? + jQuery.map( elem.options, function( elem ) { + return elem.selected; + }).join("-") : + ""; + + } else if ( elem.nodeName.toLowerCase() === "select" ) { + val = elem.selectedIndex; + } + + return val; + }, + + testChange = function testChange( e ) { + var elem = e.target, data, val; + + if ( !formElems.test( elem.nodeName ) || elem.readOnly ) { + return; + } + + data = jQuery.data( elem, "_change_data" ); + val = getVal(elem); + + // the current data will be also retrieved by beforeactivate + if ( e.type !== "focusout" || elem.type !== "radio" ) { + jQuery.data( elem, "_change_data", val ); + } + + if ( data === undefined || val === data ) { + return; + } + + if ( data != null || val ) { + e.type = "change"; + return jQuery.event.trigger( e, arguments[1], elem ); + } + }; + + jQuery.event.special.change = { + filters: { + focusout: testChange, + + click: function( e ) { + var elem = e.target, type = elem.type; + + if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) { + return testChange.call( this, e ); + } + }, + + // Change has to be called before submit + // Keydown will be called before keypress, which is used in submit-event delegation + keydown: function( e ) { + var elem = e.target, type = elem.type; + + if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") || + (e.keyCode === 32 && (type === "checkbox" || type === "radio")) || + type === "select-multiple" ) { + return testChange.call( this, e ); + } + }, + + // Beforeactivate happens also before the previous element is blurred + // with this event you can't trigger a change event, but you can store + // information/focus[in] is not needed anymore + beforeactivate: function( e ) { + var elem = e.target; + jQuery.data( elem, "_change_data", getVal(elem) ); + } + }, + + setup: function( data, namespaces ) { + if ( this.type === "file" ) { + return false; + } + + for ( var type in changeFilters ) { + jQuery.event.add( this, type + ".specialChange", changeFilters[type] ); + } + + return formElems.test( this.nodeName ); + }, + + teardown: function( namespaces ) { + jQuery.event.remove( this, ".specialChange" ); + + return formElems.test( this.nodeName ); + } + }; + + changeFilters = jQuery.event.special.change.filters; +} + +function trigger( type, elem, args ) { + args[0].type = type; + return jQuery.event.handle.apply( elem, args ); +} + +// Create "bubbling" focus and blur events +if ( document.addEventListener ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + jQuery.event.special[ fix ] = { + setup: function() { + this.addEventListener( orig, handler, true ); + }, + teardown: function() { + this.removeEventListener( orig, handler, true ); + } + }; + + function handler( e ) { + e = jQuery.event.fix( e ); + e.type = fix; + return jQuery.event.handle.call( this, e ); + } + }); +} + +jQuery.each(["bind", "one"], function( i, name ) { + jQuery.fn[ name ] = function( type, data, fn ) { + // Handle object literals + if ( typeof type === "object" ) { + for ( var key in type ) { + this[ name ](key, data, type[key], fn); + } + return this; + } + + if ( jQuery.isFunction( data ) ) { + fn = data; + data = undefined; + } + + var handler = name === "one" ? jQuery.proxy( fn, function( event ) { + jQuery( this ).unbind( event, handler ); + return fn.apply( this, arguments ); + }) : fn; + + if ( type === "unload" && name !== "one" ) { + this.one( type, data, fn ); + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + jQuery.event.add( this[i], type, handler, data ); + } + } + + return this; + }; +}); + +jQuery.fn.extend({ + unbind: function( type, fn ) { + // Handle object literals + if ( typeof type === "object" && !type.preventDefault ) { + for ( var key in type ) { + this.unbind(key, type[key]); + } + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + jQuery.event.remove( this[i], type, fn ); + } + } + + return this; + }, + + delegate: function( selector, types, data, fn ) { + return this.live( types, data, fn, selector ); + }, + + undelegate: function( selector, types, fn ) { + if ( arguments.length === 0 ) { + return this.unbind( "live" ); + + } else { + return this.die( types, null, fn, selector ); + } + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + + triggerHandler: function( type, data ) { + if ( this[0] ) { + var event = jQuery.Event( type ); + event.preventDefault(); + event.stopPropagation(); + jQuery.event.trigger( event, data, this[0] ); + return event.result; + } + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, i = 1; + + // link all the functions, so any of them can unbind this click handler + while ( i < args.length ) { + jQuery.proxy( fn, args[ i++ ] ); + } + + return this.click( jQuery.proxy( fn, function( event ) { + // Figure out which function to execute + var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i; + jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ lastToggle ].apply( this, arguments ) || false; + })); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +}); + +var liveMap = { + focus: "focusin", + blur: "focusout", + mouseenter: "mouseover", + mouseleave: "mouseout" +}; + +jQuery.each(["live", "die"], function( i, name ) { + jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) { + var type, i = 0, match, namespaces, preType, + selector = origSelector || this.selector, + context = origSelector ? this : jQuery( this.context ); + + if ( jQuery.isFunction( data ) ) { + fn = data; + data = undefined; + } + + types = (types || "").split(" "); + + while ( (type = types[ i++ ]) != null ) { + match = rnamespaces.exec( type ); + namespaces = ""; + + if ( match ) { + namespaces = match[0]; + type = type.replace( rnamespaces, "" ); + } + + if ( type === "hover" ) { + types.push( "mouseenter" + namespaces, "mouseleave" + namespaces ); + continue; + } + + preType = type; + + if ( type === "focus" || type === "blur" ) { + types.push( liveMap[ type ] + namespaces ); + type = type + namespaces; + + } else { + type = (liveMap[ type ] || type) + namespaces; + } + + if ( name === "live" ) { + // bind live handler + context.each(function(){ + jQuery.event.add( this, liveConvert( type, selector ), + { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } ); + }); + + } else { + // unbind live handler + context.unbind( liveConvert( type, selector ), fn ); + } + } + + return this; + } +}); + +function liveHandler( event ) { + var stop, elems = [], selectors = [], args = arguments, + related, match, handleObj, elem, j, i, l, data, + events = jQuery.data( this, "events" ); + + // Make sure we avoid non-left-click bubbling in Firefox (#3861) + if ( event.liveFired === this || !events || !events.live || event.button && event.type === "click" ) { + return; + } + + event.liveFired = this; + + var live = events.live.slice(0); + + for ( j = 0; j < live.length; j++ ) { + handleObj = live[j]; + + if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) { + selectors.push( handleObj.selector ); + + } else { + live.splice( j--, 1 ); + } + } + + match = jQuery( event.target ).closest( selectors, event.currentTarget ); + + for ( i = 0, l = match.length; i < l; i++ ) { + for ( j = 0; j < live.length; j++ ) { + handleObj = live[j]; + + if ( match[i].selector === handleObj.selector ) { + elem = match[i].elem; + related = null; + + // Those two events require additional checking + if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) { + related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0]; + } + + if ( !related || related !== elem ) { + elems.push({ elem: elem, handleObj: handleObj }); + } + } + } + } + + for ( i = 0, l = elems.length; i < l; i++ ) { + match = elems[i]; + event.currentTarget = match.elem; + event.data = match.handleObj.data; + event.handleObj = match.handleObj; + + if ( match.handleObj.origHandler.apply( match.elem, args ) === false ) { + stop = false; + break; + } + } + + return stop; +} + +function liveConvert( type, selector ) { + return "live." + (type && type !== "*" ? type + "." : "") + selector.replace(/\./g, "`").replace(/ /g, "&"); +} + +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( fn ) { + return fn ? this.bind( name, fn ) : this.trigger( name ); + }; + + if ( jQuery.attrFn ) { + jQuery.attrFn[ name ] = true; + } +}); + +// Prevent memory leaks in IE +// Window isn't included so as not to unbind existing unload events +// More info: +// - http://isaacschlueter.com/2006/10/msie-memory-leaks/ +if ( window.attachEvent && !window.addEventListener ) { + window.attachEvent("onunload", function() { + for ( var id in jQuery.cache ) { + if ( jQuery.cache[ id ].handle ) { + // Try/Catch is to handle iframes being unloaded, see #4280 + try { + jQuery.event.remove( jQuery.cache[ id ].handle.elem ); + } catch(e) {} + } + } + }); +} +/*! + * Sizzle CSS Selector Engine - v1.0 + * Copyright 2009, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true; + +// Here we check if the JavaScript engine is using some sort of +// optimization where it does not always call our comparision +// function. If that is the case, discard the hasDuplicate value. +// Thus far that includes Google Chrome. +[0, 0].sort(function(){ + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function(selector, context, results, seed) { + results = results || []; + var origContext = context = context || document; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var parts = [], m, set, checkSet, extra, prune = true, contextXML = isXML(context), + soFar = selector; + + // Reset the position of the chunker regexp (start from head) + while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context ); + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) { + selector += parts.shift(); + } + + set = posProcess( selector, set ); + } + } + } else { + // Take a shortcut and set the context if the root selector is an ID + // (but not if it'll be faster if the inner selector is an ID) + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + var ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0]; + } + + if ( context ) { + var ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray(set); + } else { + prune = false; + } + + while ( parts.length ) { + var cur = parts.pop(), pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + Sizzle.error( cur || selector ); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + } else if ( context && context.nodeType === 1 ) { + for ( var i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + } else { + for ( var i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function(results){ + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort(sortOrder); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[i-1] ) { + results.splice(i--, 1); + } + } + } + } + + return results; +}; + +Sizzle.matches = function(expr, set){ + return Sizzle(expr, null, null, set); +}; + +Sizzle.find = function(expr, context, isXML){ + var set, match; + + if ( !expr ) { + return []; + } + + for ( var i = 0, l = Expr.order.length; i < l; i++ ) { + var type = Expr.order[i], match; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + var left = match[1]; + match.splice(1,1); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace(/\\/g, ""); + set = Expr.find[ type ]( match, context, isXML ); + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = context.getElementsByTagName("*"); + } + + return {set: set, expr: expr}; +}; + +Sizzle.filter = function(expr, set, inplace, not){ + var old = expr, result = [], curLoop = set, match, anyFound, + isXMLFilter = set && set[0] && isXML(set[0]); + + while ( expr && set.length ) { + for ( var type in Expr.filter ) { + if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { + var filter = Expr.filter[ type ], found, item, left = match[1]; + anyFound = false; + + match.splice(1,1); + + if ( left.substr( left.length - 1 ) === "\\" ) { + continue; + } + + if ( curLoop === result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( var i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + var pass = not ^ !!found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + } else { + curLoop[i] = false; + } + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + // Improper expression + if ( expr === old ) { + if ( anyFound == null ) { + Sizzle.error( expr ); + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +Sizzle.error = function( msg ) { + throw "Syntax error, unrecognized expression: " + msg; +}; + +var Expr = Sizzle.selectors = { + order: [ "ID", "NAME", "TAG" ], + match: { + ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ + }, + leftMatch: {}, + attrMap: { + "class": "className", + "for": "htmlFor" + }, + attrHandle: { + href: function(elem){ + return elem.getAttribute("href"); + } + }, + relative: { + "+": function(checkSet, part){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !/\W/.test(part), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag ) { + part = part.toLowerCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + ">": function(checkSet, part){ + var isPartStr = typeof part === "string"; + + if ( isPartStr && !/\W/.test(part) ) { + part = part.toLowerCase(); + + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + } + } + } else { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + "": function(checkSet, part, isXML){ + var doneName = done++, checkFn = dirCheck; + + if ( typeof part === "string" && !/\W/.test(part) ) { + var nodeCheck = part = part.toLowerCase(); + checkFn = dirNodeCheck; + } + + checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML); + }, + "~": function(checkSet, part, isXML){ + var doneName = done++, checkFn = dirCheck; + + if ( typeof part === "string" && !/\W/.test(part) ) { + var nodeCheck = part = part.toLowerCase(); + checkFn = dirNodeCheck; + } + + checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML); + } + }, + find: { + ID: function(match, context, isXML){ + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + return m ? [m] : []; + } + }, + NAME: function(match, context){ + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], results = context.getElementsByName(match[1]); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + TAG: function(match, context){ + return context.getElementsByTagName(match[1]); + } + }, + preFilter: { + CLASS: function(match, curLoop, inplace, result, not, isXML){ + match = " " + match[1].replace(/\\/g, "") + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n]/g, " ").indexOf(match) >= 0) ) { + if ( !inplace ) { + result.push( elem ); + } + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + ID: function(match){ + return match[1].replace(/\\/g, ""); + }, + TAG: function(match, curLoop){ + return match[1].toLowerCase(); + }, + CHILD: function(match){ + if ( match[1] === "nth" ) { + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' + var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec( + match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + // calculate the numbers (first)n+(last) including if they are negative + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + + // TODO: Move to normal caching system + match[0] = done++; + + return match; + }, + ATTR: function(match, curLoop, inplace, result, not, isXML){ + var name = match[1].replace(/\\/g, ""); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + PSEUDO: function(match, curLoop, inplace, result, not){ + if ( match[1] === "not" ) { + // If we're dealing with a complex expression, or a simple one + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + if ( !inplace ) { + result.push.apply( result, ret ); + } + return false; + } + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + POS: function(match){ + match.unshift( true ); + return match; + } + }, + filters: { + enabled: function(elem){ + return elem.disabled === false && elem.type !== "hidden"; + }, + disabled: function(elem){ + return elem.disabled === true; + }, + checked: function(elem){ + return elem.checked === true; + }, + selected: function(elem){ + // Accessing this property makes selected-by-default + // options in Safari work properly + elem.parentNode.selectedIndex; + return elem.selected === true; + }, + parent: function(elem){ + return !!elem.firstChild; + }, + empty: function(elem){ + return !elem.firstChild; + }, + has: function(elem, i, match){ + return !!Sizzle( match[3], elem ).length; + }, + header: function(elem){ + return /h\d/i.test( elem.nodeName ); + }, + text: function(elem){ + return "text" === elem.type; + }, + radio: function(elem){ + return "radio" === elem.type; + }, + checkbox: function(elem){ + return "checkbox" === elem.type; + }, + file: function(elem){ + return "file" === elem.type; + }, + password: function(elem){ + return "password" === elem.type; + }, + submit: function(elem){ + return "submit" === elem.type; + }, + image: function(elem){ + return "image" === elem.type; + }, + reset: function(elem){ + return "reset" === elem.type; + }, + button: function(elem){ + return "button" === elem.type || elem.nodeName.toLowerCase() === "button"; + }, + input: function(elem){ + return /input|select|textarea|button/i.test(elem.nodeName); + } + }, + setFilters: { + first: function(elem, i){ + return i === 0; + }, + last: function(elem, i, match, array){ + return i === array.length - 1; + }, + even: function(elem, i){ + return i % 2 === 0; + }, + odd: function(elem, i){ + return i % 2 === 1; + }, + lt: function(elem, i, match){ + return i < match[3] - 0; + }, + gt: function(elem, i, match){ + return i > match[3] - 0; + }, + nth: function(elem, i, match){ + return match[3] - 0 === i; + }, + eq: function(elem, i, match){ + return match[3] - 0 === i; + } + }, + filter: { + PSEUDO: function(elem, match, i, array){ + var name = match[1], filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; + } else if ( name === "not" ) { + var not = match[3]; + + for ( var i = 0, l = not.length; i < l; i++ ) { + if ( not[i] === elem ) { + return false; + } + } + + return true; + } else { + Sizzle.error( "Syntax error, unrecognized expression: " + name ); + } + }, + CHILD: function(elem, match){ + var type = match[1], node = elem; + switch (type) { + case 'only': + case 'first': + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + if ( type === "first" ) { + return true; + } + node = elem; + case 'last': + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + return true; + case 'nth': + var first = match[2], last = match[3]; + + if ( first === 1 && last === 0 ) { + return true; + } + + var doneName = match[0], + parent = elem.parentNode; + + if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { + var count = 0; + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + parent.sizcache = doneName; + } + + var diff = elem.nodeIndex - last; + if ( first === 0 ) { + return diff === 0; + } else { + return ( diff % first === 0 && diff / first >= 0 ); + } + } + }, + ID: function(elem, match){ + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + TAG: function(elem, match){ + return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match; + }, + CLASS: function(elem, match){ + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + ATTR: function(elem, match){ + var name = match[1], + result = Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value !== check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + POS: function(elem, match, i, array){ + var name = match[2], filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, function(all, num){ + return "\\" + (num - 0 + 1); + })); +} + +var makeArray = function(array, results) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +// Perform a simple check to determine if the browser is capable of +// converting a NodeList to an array using builtin methods. +// Also verifies that the returned array holds DOM nodes +// (which is not the case in the Blackberry browser) +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; + +// Provide a fallback method if it does not work +} catch(e){ + makeArray = function(array, results) { + var ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + } else { + if ( typeof array.length === "number" ) { + for ( var i = 0, l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + } else { + for ( var i = 0; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; +} + +var sortOrder; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + if ( a == b ) { + hasDuplicate = true; + } + return a.compareDocumentPosition ? -1 : 1; + } + + var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1; + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} else if ( "sourceIndex" in document.documentElement ) { + sortOrder = function( a, b ) { + if ( !a.sourceIndex || !b.sourceIndex ) { + if ( a == b ) { + hasDuplicate = true; + } + return a.sourceIndex ? -1 : 1; + } + + var ret = a.sourceIndex - b.sourceIndex; + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} else if ( document.createRange ) { + sortOrder = function( a, b ) { + if ( !a.ownerDocument || !b.ownerDocument ) { + if ( a == b ) { + hasDuplicate = true; + } + return a.ownerDocument ? -1 : 1; + } + + var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange(); + aRange.setStart(a, 0); + aRange.setEnd(a, 0); + bRange.setStart(b, 0); + bRange.setEnd(b, 0); + var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange); + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} + +// Utility function for retreiving the text value of an array of DOM nodes +function getText( elems ) { + var ret = "", elem; + + for ( var i = 0; elems[i]; i++ ) { + elem = elems[i]; + + // Get the text from text nodes and CDATA nodes + if ( elem.nodeType === 3 || elem.nodeType === 4 ) { + ret += elem.nodeValue; + + // Traverse everything else, except comment nodes + } else if ( elem.nodeType !== 8 ) { + ret += getText( elem.childNodes ); + } + } + + return ret; +} + +// Check to see if the browser returns elements by name when +// querying by getElementById (and provide a workaround) +(function(){ + // We're going to inject a fake input element with a specified name + var form = document.createElement("div"), + id = "script" + (new Date).getTime(); + form.innerHTML = ""; + + // Inject it into the root element, check its status, and remove it quickly + var root = document.documentElement; + root.insertBefore( form, root.firstChild ); + + // The workaround has to do additional checks after a getElementById + // Which slows things down for other browsers (hence the branching) + if ( document.getElementById( id ) ) { + Expr.find.ID = function(match, context, isXML){ + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; + } + }; + + Expr.filter.ID = function(elem, match){ + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } + + root.removeChild( form ); + root = form = null; // release memory in IE +})(); + +(function(){ + // Check to see if the browser returns only elements + // when doing getElementsByTagName("*") + + // Create a fake element + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + // Make sure no comments are found + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function(match, context){ + var results = context.getElementsByTagName(match[1]); + + // Filter out possible comments + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + // Check to see if an attribute returns normalized href attributes + div.innerHTML = ""; + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + Expr.attrHandle.href = function(elem){ + return elem.getAttribute("href", 2); + }; + } + + div = null; // release memory in IE +})(); + +if ( document.querySelectorAll ) { + (function(){ + var oldSizzle = Sizzle, div = document.createElement("div"); + div.innerHTML = "

"; + + // Safari can't handle uppercase or unicode characters when + // in quirks mode. + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function(query, context, extra, seed){ + context = context || document; + + // Only use querySelectorAll on non-XML documents + // (ID selectors don't work in non-HTML documents) + if ( !seed && context.nodeType === 9 && !isXML(context) ) { + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(e){} + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + div = null; // release memory in IE + })(); +} + +(function(){ + var div = document.createElement("div"); + + div.innerHTML = "
"; + + // Opera can't find a second classname (in 9.6) + // Also, make sure that getElementsByClassName actually exists + if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { + return; + } + + // Safari caches class attributes, doesn't catch changes (in 3.2) + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) { + return; + } + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function(match, context, isXML) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; + + div = null; // release memory in IE +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + elem = elem[dir]; + var match = false; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem.sizcache = doneName; + elem.sizset = i; + } + + if ( elem.nodeName.toLowerCase() === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + elem = elem[dir]; + var match = false; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem.sizcache = doneName; + elem.sizset = i; + } + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +var contains = document.compareDocumentPosition ? function(a, b){ + return !!(a.compareDocumentPosition(b) & 16); +} : function(a, b){ + return a !== b && (a.contains ? a.contains(b) : true); +}; + +var isXML = function(elem){ + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +var posProcess = function(selector, context){ + var tmpSet = [], later = "", match, + root = context.nodeType ? [context] : context; + + // Position selectors must be done after the filter + // And so must :not(positional) so we move all PSEUDOs to the end + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet ); + } + + return Sizzle.filter( later, tmpSet ); +}; + +// EXPOSE +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.filters; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = getText; +jQuery.isXMLDoc = isXML; +jQuery.contains = contains; + +return; + +window.Sizzle = Sizzle; + +})(); +var runtil = /Until$/, + rparentsprev = /^(?:parents|prevUntil|prevAll)/, + // Note: This RegExp should be improved, or likely pulled from Sizzle + rmultiselector = /,/, + slice = Array.prototype.slice; + +// Implement the identical functionality for filter and not +var winnow = function( elements, qualifier, keep ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) === keep; + }); + + } else if ( qualifier.nodeType ) { + return jQuery.grep(elements, function( elem, i ) { + return (elem === qualifier) === keep; + }); + + } else if ( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function( elem ) { + return elem.nodeType === 1; + }); + + if ( isSimple.test( qualifier ) ) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter( qualifier, filtered ); + } + } + + return jQuery.grep(elements, function( elem, i ) { + return (jQuery.inArray( elem, qualifier ) >= 0) === keep; + }); +}; + +jQuery.fn.extend({ + find: function( selector ) { + var ret = this.pushStack( "", "find", selector ), length = 0; + + for ( var i = 0, l = this.length; i < l; i++ ) { + length = ret.length; + jQuery.find( selector, this[i], ret ); + + if ( i > 0 ) { + // Make sure that the results are unique + for ( var n = length; n < ret.length; n++ ) { + for ( var r = 0; r < length; r++ ) { + if ( ret[r] === ret[n] ) { + ret.splice(n--, 1); + break; + } + } + } + } + } + + return ret; + }, + + has: function( target ) { + var targets = jQuery( target ); + return this.filter(function() { + for ( var i = 0, l = targets.length; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector, false), "not", selector); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector, true), "filter", selector ); + }, + + is: function( selector ) { + return !!selector && jQuery.filter( selector, this ).length > 0; + }, + + closest: function( selectors, context ) { + if ( jQuery.isArray( selectors ) ) { + var ret = [], cur = this[0], match, matches = {}, selector; + + if ( cur && selectors.length ) { + for ( var i = 0, l = selectors.length; i < l; i++ ) { + selector = selectors[i]; + + if ( !matches[selector] ) { + matches[selector] = jQuery.expr.match.POS.test( selector ) ? + jQuery( selector, context || this.context ) : + selector; + } + } + + while ( cur && cur.ownerDocument && cur !== context ) { + for ( selector in matches ) { + match = matches[selector]; + + if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) { + ret.push({ selector: selector, elem: cur }); + delete matches[selector]; + } + } + cur = cur.parentNode; + } + } + + return ret; + } + + var pos = jQuery.expr.match.POS.test( selectors ) ? + jQuery( selectors, context || this.context ) : null; + + return this.map(function( i, cur ) { + while ( cur && cur.ownerDocument && cur !== context ) { + if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selectors) ) { + return cur; + } + cur = cur.parentNode; + } + return null; + }); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + if ( !elem || typeof elem === "string" ) { + return jQuery.inArray( this[0], + // If it receives a string, the selector is used + // If it receives nothing, the siblings are used + elem ? jQuery( elem ) : this.parent().children() ); + } + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context || this.context ) : + jQuery.makeArray( selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? + all : + jQuery.unique( all ) ); + }, + + andSelf: function() { + return this.add( this.prevObject ); + } +}); + +// A painfully simple check to see if an element is disconnected +// from a document (should be improved, where feasible). +function isDisconnected( node ) { + return !node || !node.parentNode || node.parentNode.nodeType === 11; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return jQuery.nth( elem, 2, "nextSibling" ); + }, + prev: function( elem ) { + return jQuery.nth( elem, 2, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( elem.parentNode.firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.makeArray( elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 ? jQuery.unique( ret ) : ret; + + if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, slice.call(arguments).join(",") ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return jQuery.find.matches(expr, elems); + }, + + dir: function( elem, dir, until ) { + var matched = [], cur = elem[dir]; + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + nth: function( cur, result, dir, elem ) { + result = result || 1; + var num = 0; + + for ( ; cur; cur = cur[dir] ) { + if ( cur.nodeType === 1 && ++num === result ) { + break; + } + } + + return cur; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); +var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /(<([\w:]+)[^>]*?)\/>/g, + rselfClosing = /^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i, + rtagName = /<([\w:]+)/, + rtbody = /"; + }, + wrapMap = { + option: [ 1, "" ], + legend: [ 1, "
", "
" ], + thead: [ 1, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + col: [ 2, "", "
" ], + area: [ 1, "", "" ], + _default: [ 0, "", "" ] + }; + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// IE can't serialize and diff --git a/modules/integration_search/tpl/index.html b/modules/integration_search/tpl/index.html index 1690bd8ab..3f780d095 100644 --- a/modules/integration_search/tpl/index.html +++ b/modules/integration_search/tpl/index.html @@ -33,11 +33,11 @@ - {$lang->cmd_insert} - {$lang->cmd_delete} + {$lang->cmd_insert} + {$lang->cmd_delete} diff --git a/modules/layout/lang/ru.lang.php b/modules/layout/lang/ru.lang.php index c1a10c43f..0b06297a1 100644 --- a/modules/layout/lang/ru.lang.php +++ b/modules/layout/lang/ru.lang.php @@ -31,82 +31,83 @@ Пожалуйста, сначала используйте предпросмотр кода и затем сохраните его. Вы можете обратиться к грамматике шаблонов XE с XE Template."; - $lang->layout_export = '내보내기'; - $lang->layout_btn_export = '내 레이아웃 다운로드'; - $lang->about_layout_export = '현재 수정된 레이아웃을 내보내기를 합니다.'; - $lang->layout_import = '가져오기'; - $lang->about_layout_import = '가져오기를 할 경우 기존 수정된 레이아웃을 삭제가 됩니다. 가져오기를 하기전에 내보내기를 통해 백업을 하시기 바랍니다.'; - $lang->layout_manager = array( - 0 => '레이아웃 매니저', - 1 => '저장', - 2 => '취소', - 3 => '형태', - 4 => '배열', - 5 => '정렬', - 6 => '고정 레이아웃', - 7 => '가변 레이아웃', - 8 => '고정+가변(내용)', - 9 => '1칸', - 10 => '2칸 (내용 왼쪽)', - 11 => '2칸 (내용 오른쪽)', - 12 => '3칸 (내용 왼쪽)', - 13 => '3칸 (내용 가운데)', - 14 => '3칸 (내용 오른쪽)', - 15 => '왼쪽', - 16 => '가운데', - 17 => '오른쪽', - 18 => '전체', - 19 => '레이아웃', - 20 => '위젯 추가', - 21 => '내용 위젯 추가', - 22 => '속성', - 23 => '위젯 스타일', - 24 => '수정', - 25 => '삭제', - 26 => '정렬', - 27 => '한줄 차지', - 28 => '왼쪽', - 29 => '오른쪽', - 30 => '가로 너비', - 31 => '높이', - 32 => '바깥 여백', - 33 => '안쪽 여백', - 34 => '위', - 35 => '왼', - 36 => '오른', - 37 => '아래', - 38 => '테두리', - 39 => '없음', - 40 => '배경', - 41 => '색상', - 42 => '그림', - 43 => '선택', - 44 => '배경 그림 반복', - 45 => '반복', - 46 => '반복 안함', - 47 => '가로 반복', - 48 => '세로 반복', - 49 => '적용', - 50 => '취소', - 51 => '초기화', - 52 => '글자', - 53 => '글자 폰트', - 54 => '글자 색', + $lang->layout_export = 'Export'; + $lang->layout_btn_export = 'Download My Layout'; + $lang->about_layout_export = 'Export currently editted layout.'; + $lang->layout_import = 'Import'; + $lang->about_layout_import = 'Original layout will be deleted when you import. Please export current layout before importing.'; + + $lang->layout_manager = array( + 0 => 'Layout Manager', + 1 => 'Save', + 2 => 'Cancel', + 3 => 'Form', + 4 => 'Array', + 5 => 'Arrange', + 6 => 'Fixed Layout', + 7 => 'Variable Layout', + 8 => 'Fixed+Variable (Content)', + 9 => '1 Cell', + 10 => '2 Cells (left of content)', + 11 => '2 Cells (right of content)', + 12 => '3 Cells (left of content)', + 13 => '3 Cells (center of content)', + 14 => '3 Cells (right of content)', + 15 => 'Left', + 16 => 'Center', + 17 => 'Right', + 18 => 'All', + 19 => 'Layout', + 20 => 'Add Widget', + 21 => 'Add Content Widget', + 22 => 'Attribute', + 23 => 'Widget Style', + 24 => 'Modify', + 25 => 'Delete', + 26 => 'Align', + 27 => 'Occupy a Line', + 28 => 'Left', + 29 => 'Right', + 30 => 'Width', + 31 => 'Height', + 32 => 'Margin', + 33 => 'Padding', + 34 => 'Top', + 35 => 'Left', + 36 => 'Right', + 37 => 'Bottom', + 38 => 'Border', + 39 => 'None', + 40 => 'Background', + 41 => 'Color', + 42 => 'Image', + 43 => 'Select', + 44 => 'Repeat Background', + 45 => 'Repeat', + 46 => 'No Repeat', + 47 => 'Repeat Width', + 48 => 'Repeat Height', + 49 => 'Apply', + 50 => 'Cancel', + 51 => 'Reset', + 52 => 'Text', + 53 => 'Font', + 54 => 'Font Color', ); - $lang->layout_image_repository = '레이아웃 파일 저장소'; - $lang->about_layout_image_repository = '선택된 레이아웃에 사용될 이미지/플래시파일등을 올릴 수 있습니다. 내보내기에 같이 포함이 됩니다'; - $lang->msg_layout_image_target = 'gif, png, jpg, swf, flv파일만 가능합니다'; - $lang->layout_migration = '레이아웃 내보내기/ 들이기'; - $lang->about_layout_migration = '수정된 레이아웃을 tar 파일로 내보내거나 tar 파일로 저장된 것을 불러올 수 있습니다'."\n".'(아직은 faceOff레이아웃만 내보내기/들이기가 됩니다'; + $lang->layout_image_repository = 'Layout Repository'; + $lang->about_layout_image_repository = 'You can upload images/flash files for selected layout. They will be included in exports'; + $lang->msg_layout_image_target = 'Only gif, png, jpg, swf, flv files are allowed'; + $lang->layout_migration = 'Layout Migration'; + $lang->about_layout_migration = 'You can export or import editted layout as tar file'."\n".'(So far only FaceOff supports exports/imports)'; $lang->about_faceoff = array( - 'title' => 'XpressEngine FaceOff Layout 관리자', - 'description' => 'FaceOff Layout관리자는 웹상에서 쉽게 레이아웃을 꾸밀 수 있습니다.
아래 그림을 보시고 구성요소와 기능을 이용하여 원하시는 레이아웃을 만드세요', - 'layout' => 'FaceOff는 위와 같은 HTML 구조로 되어 있습니다.
이 구조에서 CSS를 이용하여 형태/배열/정렬을 할 수 있고 또 Style을 이용하여 꾸밀 수 있습니다.
위젯 추가는 Extension(e1, e2)와 Neck, Knee에서 가능합니다.
이 외 Body, Layout, Header, Body, Footer는 Style을 꾸밀 수 있고 Content는 모듈의 내용이 출력됩니다.', - 'setting' => '좌측 상단의 메뉴에 대해 설명 드립니다.
  • 저장 : 설정된 내용을 저장합니다.
  • 취소 : 설정한 내용을 저장하지 않고 돌아갑니다.
  • 초기화 : 아무 설정도 되어 있지 않은 백지 상태로 돌립니다
  • 형태 : 고정/ 가변/ 고정+가변(내용)의 형태를 지정합니다.
  • 배열 : Extension 2개와 Content를 배열합니다.
  • 정렬 : 레이아웃의 위치를 정렬시킬 수 있습니다.
', - 'hotkey' => '마우스로 각 영역을 선택하면서 Hot Key를 이용하시면 더 쉽게 꾸미실 수 있습니다.
  • tab 키 : 위젯이 선택되어 있지 않으면 Header, Body, Footer 순으로 선택됩니다. 위젯이 선택되어 있다면 다음 위젯으로 선택이 이동됩니다.
  • Shift + tab키 : tab키와 반대 역할을 합니다.
  • Esc : 아무것도 선택되어 있지 않을때 Esc를 누르면 Neck, Extension(e1,e2),Knee 순서대로 선택이 되며 위젯이 선택되어 있다면 선택된 위젯을 감싸는 영역이 선택됩니다.
  • 방향키 : 위젯이 선택되어 있을때 방향키를 이용하여 위젯을 다른 영역으로 이동시킬 수 있습니다.
', - 'attribute' => '위젯을 제외한 각 영역들은 모두 배경 색/ 이미지를 지정할 수 있고 글자색(a 태그 포함됨)을 정할 수 있습니다.', + 'title' => 'XpressEngine FaceOff Layout Manager', + 'description' => 'FaceOff Layout Manager willl help you design layout on the web easily.
Please design your own layout with components and functions as shown below.', + 'layout' => 'FaceOff has HTML structure as above.
You can arrange/align with CSS, or use Style to design.
You can add widget from Extension(e1, e2), Neck and Knee.
Also Body, Layout, Header, Body, Footer can designed by Style, and Content will display content.', + 'setting' => 'Let me explain you the upper menu on left.
  • Save : Save current settings.
  • Cancel : Discard current settings and go back.
  • Reset : Clear current settings
  • Form : Set form as Fixed/ Variable/ Fixed+Variable(Content).
  • Arrange : Arrange 2 Extensions and Content.
  • Align : Align the position of layout.
', + 'hotkey' => 'You can design your layout more easily with Hot Keys.
  • tab : Unless a widget is selected, Header, Body, Footer will be selected in order. If not, next widget will be selected.
  • Shift + tab : It does the opposite function to tab key.
  • Esc : If nothing is selected, Neck, Extension(e1,e2),Knee will be selected in order, if a widget is selected, area of the widget will be selected.
  • Arrow Key : If a widget is selected, arrow key will move the widget to other areas.
', + 'attribute' => 'You can set background color/image to every area except widget, and font color(include tag).', ); ?> diff --git a/modules/member/conf/info.xml b/modules/member/conf/info.xml index 10a31f2f1..7f188c8b7 100644 --- a/modules/member/conf/info.xml +++ b/modules/member/conf/info.xml @@ -6,8 +6,8 @@ Member Management Quản lý thành viên Usuario Gestión - Пользователи Управление - 會員管理 + Управление пользователями + 會員 管理 회원 관리 및 회원 관련 설정등을 하는 모듈입니다. 对会员进行管理及相关设置的模块。 会員管理及び会員関連設定などを行うモジュールです。 diff --git a/modules/member/lang/ru.lang.php b/modules/member/lang/ru.lang.php index 5642e0623..d342434b8 100644 --- a/modules/member/lang/ru.lang.php +++ b/modules/member/lang/ru.lang.php @@ -6,60 +6,61 @@ **/ $lang->member = 'Пользователь'; - $lang->member_default_info = 'Базовая информация'; + $lang->member_default_info = 'Основная информация'; $lang->member_extend_info = 'Дополнительная информация'; - $lang->default_group_1 = "Общая группа"; - $lang->default_group_2 = "Особая группа"; - $lang->admin_group = "Администативная группа"; - $lang->keep_signed = '로그인 유지'; + $lang->default_group_1 = "Новичок"; + $lang->default_group_2 = "Постоянный участник"; + $lang->admin_group = "Администратор"; + $lang->keep_signed = 'Сохранить логин'; $lang->remember_user_id = 'Сохранить ID'; $lang->already_logged = "Вы уже вошли"; - $lang->denied_user_id = 'Извините. Этот ID запрещен.'; - $lang->null_user_id = 'Пожалуйста, введите ID пользователя'; + $lang->denied_user_id = 'Извините. Этот ID запрещен'; + $lang->null_user_id = 'Пожалуйста, введите ID'; $lang->null_password = 'Пожалуйста, введите пароль'; - $lang->invalid_authorization = 'Не авторизировано'; + $lang->invalid_authorization = 'Вы не авторизированы'; $lang->invalid_user_id= "Указанный ID не существует"; $lang->invalid_password = 'Неверный пароль'; - $lang->allow_mailing = 'Присоединиться к списку рассылки'; - $lang->denied = 'Отказано'; + $lang->allow_mailing = 'Получать рассылки'; + $lang->denied = 'Отменить пользование'; $lang->is_admin = 'Суперадминистративные права'; - $lang->group = 'Присвоенная группа'; + $lang->group = 'Группа'; $lang->group_title = 'Имя группы'; $lang->group_srl = 'Номер группы'; $lang->signature = 'Подпись'; - $lang->profile_image = 'Изображение профиля'; + $lang->profile_image = 'Фотография участника'; $lang->profile_image_max_width = 'Макс. ширина'; $lang->profile_image_max_height = 'Макс. высота'; $lang->image_name = 'Имя изображения'; $lang->image_name_max_width = 'Макс. ширина'; $lang->image_name_max_height = 'Макс. высота'; - $lang->image_mark = 'Изображение-марка'; + $lang->image_mark = 'Image Mark'; $lang->image_mark_max_width = 'Макс. ширина'; $lang->image_mark_max_height = 'Макс. высота'; $lang->group_image_mark = 'Group Image Mark'; $lang->group_image_mark_max_width = 'Макс. ширина'; $lang->group_image_mark_max_height = 'Макс. высота'; - $lang->group_image_mark_order = '그룹 이미지 마크 순서'; + $lang->group_image_mark_order = 'Group Image Mark Order'; + $lang->signature_max_height = 'Max Signature Height'; $lang->enable_openid = 'Включить открытый ID (OpenID)'; - $lang->enable_join = 'Позволить пользователям регистрироваться'; - $lang->enable_confirm = '메일 인증 사용'; - $lang->enable_ssl = 'SSL 기능 사용'; + $lang->enable_join = 'Разрешение на регистрацию'; + $lang->enable_confirm = 'Активация по email'; + $lang->enable_ssl = 'использоватьSSL'; $lang->security_sign_in = 'Sign in using enhanced security'; - $lang->limit_day = 'Временный лимит даты'; + $lang->limit_day = 'Дата временного лимит'; $lang->limit_date = 'Дата лимита'; - $lang->after_login_url = '로그인 후 이동할 URL'; - $lang->after_logout_url = '로그아웃 후 이동할 URL'; + $lang->after_login_url = 'URL после логин'; + $lang->after_logout_url = 'URL после логаут'; $lang->redirect_url = 'URL после регистрации'; $lang->agreement = 'Пользовательское соглашение о регистрации'; $lang->accept_agreement = 'Согласен'; $lang->member_info = 'Пользовательская информация'; $lang->current_password = 'Текущий пароль'; $lang->openid = 'OpenID'; - $lang->allow_message = '쪽지 허용'; + $lang->allow_message = 'Сообщения разрешены'; $lang->allow_message_type = array( - 'Y' => '모두 허용', - 'F' => '등록된 친구들만 허용', - 'N' => '모두 금지', + 'Y' => 'Разрешено всем', + 'F' => 'Разрешено только зарегистрированным друзьям', + 'N' => 'Запрещено всем', ); $lang->about_allow_message = '쪽지 허용 방법 및 대상을 지정할 수 있습니다'; $lang->logged_users = 'Logged Users'; @@ -67,9 +68,10 @@ $lang->webmaster_name = "Имя веб-мастера"; $lang->webmaster_email = "Email веб-мастера"; - $lang->about_keep_signed = '브라우저를 닫더라도 로그인이 계속 유지될 수 있습니다.\n\n로그인 유지 기능을 사용할 경우 다음 접속부터는 로그인을 하실 필요가 없습니다.\n\n단, 게임방, 학교 등 공공장소에서 이용시 개인정보가 유출될 수 있으니 꼭 로그아웃을 해주세요'; $lang->about_webmaster_name = "Пожалуйста, введите имя веб-мастера, которое будет использоваться для аутентификационных писем или другого адиминистрирования сайта. (по умолчанию : webmaster)"; - $lang->about_keep_warning = '브라우저를 닫더라도 로그인이 계속 유지될 수 있습니다. 로그인 유지 기능을 사용할 경우 다음 접속부터는 로그인을 하실 필요가 없습니다. 단, 게임방, 학교 등 공공장소에서 이용시 개인정보가 유출될 수 있으니 꼭 로그아웃을 해주세요'; $lang->about_webmaster_name = "Пожалуйста, введите имя веб-мастера, которое будет использоваться для аутентификационных писем или другого адиминистрирования сайта. (по умолчанию : webmaster)"; - $lang->about_webmaster_email = "Пожалуйста, введите email адрес веб-мастера."; + $lang->about_keep_signed = 'Вы будете в состоянии логин, даже при закрытии окна браузера.\n\nЕсли вы пользуетесь общественным компьютером, сделайте выход в целях сохранения персональных данных'; + $lang->about_keep_warning = 'Вы будете в состоянии логин, даже при закрытии окна браузера.Если вы пользуетесь общественным компьютером, сделайте выход в целях сохранения персональных данных'; + $lang->about_webmaster_name = "Пожалуйста, введите имя вебмастера, которое будет использоваться для авторизационных писем или другого адиминистрирования сайта. (по умолчанию : webmaster)"; + $lang->about_webmaster_email = "Пожалуйста, введите email адрес вебмастера."; $lang->search_target_list = array( 'user_id' => 'ID', @@ -77,92 +79,91 @@ 'nick_name' => 'Ник', 'email_address' => 'Email', 'regdate' => 'Дата регистрации', - 'regdate_more' => '가입일시(이상)', - 'regdate_less' => '가입일시(이하)', + 'regdate_more' => 'Дата регистрации(more)', + 'regdate_less' => 'Дата регистрации(less)', 'last_login' => 'Дата последнего входа', - 'last_login_more' => '최근로그인일시(이상)', - 'last_login_less' => '최근로그인일시(이하)', + 'last_login_more' => 'Last Sign in Date (more)', + 'last_login_less' => 'Last Sign in Date (less)', 'extra_vars' => 'Экстра перем.', ); - - $lang->cmd_login = 'Войти'; - $lang->cmd_logout = 'Выйти'; + $lang->cmd_login = 'Вход на сайт'; + $lang->cmd_logout = 'Выход'; $lang->cmd_signup = 'Регистрация'; - $lang->cmd_site_signup = 'Join'; + $lang->cmd_site_signup = 'Регистрация'; $lang->cmd_modify_member_info = 'Изменить информацию пользователя'; $lang->cmd_modify_member_password = 'Изменить пароль'; - $lang->cmd_view_member_info = 'Информация пользователя'; - $lang->cmd_leave = 'Покинуть'; - $lang->cmd_find_member_account = 'Найти информацию аккаунта'; - $lang->cmd_resend_auth_mail = '인증 메일 재발송'; + $lang->cmd_view_member_info = 'Личная информация'; + $lang->cmd_leave = 'Удалить аккаунт'; + $lang->cmd_find_member_account = 'Найти ID/пароль'; + $lang->cmd_resend_auth_mail = 'Послать email для авторизации'; $lang->cmd_member_list = 'Список пользователей'; $lang->cmd_module_config = 'Стандартные настройки'; - $lang->cmd_member_group = 'Увтавление группами'; - $lang->cmd_send_mail = 'Отправить почту'; + $lang->cmd_member_group = 'Управление группами'; + $lang->cmd_send_mail = 'Отправить письмо'; $lang->cmd_manage_id = 'Управление запрещенными ID'; $lang->cmd_manage_form = 'Управление формой регистрации'; - $lang->cmd_view_own_document = 'Просмотреть написанные статьи'; - $lang->cmd_manage_member_info = 'Manage Member Info'; + $lang->cmd_view_own_document = 'Просмотреть написанные записи'; + $lang->cmd_manage_member_info = 'Изменить информацию пользователя'; $lang->cmd_trace_document = 'Trace Written Articles'; $lang->cmd_trace_comment = 'Trace Written Comments'; - $lang->cmd_view_scrapped_document = 'Черновики'; - $lang->cmd_view_saved_document = 'Просмотреть сохраненные статьи'; - $lang->cmd_send_email = 'Отправить почту'; + $lang->cmd_view_scrapped_document = 'Просмотреть Scraps'; + $lang->cmd_view_saved_document = 'Просмотреть сохраненные записи'; + $lang->cmd_send_email = 'Отправить письмо'; $lang->msg_email_not_exists = "Email адрес не существует"; - $lang->msg_alreay_scrapped = 'Эта статья уже в черновиках'; + $lang->msg_alreay_scrapped = 'Эта статья уже в Scraps'; $lang->msg_cart_is_null = 'Пожалуйста, выберите назначение'; - $lang->msg_checked_file_is_deleted = '%d вложенных файлов удалено'; + $lang->msg_checked_file_is_deleted = '%d вложенные файлы удалены'; $lang->msg_find_account_title = 'Информация аккаунта'; - $lang->msg_find_account_info = 'Это требуемая информация аккаунта.'; - $lang->msg_find_account_comment = 'Пароль будет изменен на указанный выше после нажатия по ссылке ниже.
Пожалуйста, изменить пароль после входа.'; - $lang->msg_confirm_account_title = '가입 인증 메일 입니다'; - $lang->msg_confirm_account_info = '가입하신 계정 정보는 아래와 같습니다'; - $lang->msg_confirm_account_comment = '아래 링크를 클릭하시면 가입 인증이 이루어집니다.'; - $lang->msg_auth_mail_sent = 'Аутентификационное почтовое сообщение было отправлено для %s. Пожалуйста, проверьте Вашу почту.'; - $lang->msg_confirm_mail_sent = '%s 메일로 가입 인증 메일이 발송되었습니다. 메일을 확인하세요.'; - $lang->msg_invalid_auth_key = 'Неверный запрос на аутентификацию.
Пожалуйста, попытайтеть найти информацию аккаунта или свяжитесь с администратором.'; - $lang->msg_success_authed = 'Ваш аккаунт был успешно аутентифицирован.\nВход произведен. Пожалуйста, измените пароль на Ваш собственный.'; - $lang->msg_success_confirmed = '가입 인증이 정상적으로 처리 되었습니다.'; - + $lang->msg_find_account_info = 'Запрашиваемая информация аккаунта.'; + $lang->msg_find_account_comment = 'Кликните на ссылку ниже и пароль будет изменен на указанный вами.
Пожалуйста, измените пароль после входа на сайт'; + $lang->msg_confirm_account_title = 'Письмо, подтверждающее регистрацию'; + $lang->msg_confirm_account_info = 'Информация аккаунта при регистрации'; + $lang->msg_confirm_account_comment = 'Подтвердите авторизацию, кликнув на ссылку ниже'; + $lang->msg_auth_mail_sent = 'Письмо с регистрационной информацией отправлено для %s. Пожалуйста, проверьте Вашу почту'; + $lang->msg_confirm_mail_sent = 'Письмо для авторизации отправлено для %s. Пожалуйста, проверьте Вашу почту'; + $lang->msg_invalid_auth_key = 'Неверный запрос на авторизацию.
Пожалуйста, попытайтеть найти информацию аккаунта или свяжитесь с администратором.'; + $lang->msg_success_authed = 'Ваш аккаунт был успешно авторизован.\nВход произведен. Пожалуйста, измените пароль на Ваш собственный.'; + $lang->msg_success_confirmed = 'Авторизация Вашего аккаунта прошла успешно'; $lang->msg_new_member = 'Добавить пользователя'; $lang->msg_update_member = 'Изменить информацию пользователя'; - $lang->msg_leave_member = 'Покинуть'; - $lang->msg_group_is_null = 'Нет зарегистрированной группы'; + $lang->msg_leave_member = 'Удалить аккаунт'; + $lang->msg_group_is_null = 'Зарегистрированной группы нет'; $lang->msg_not_delete_default = 'Стандартные объекты не могут быть удалены'; $lang->msg_not_exists_member = "Пользователь не существует"; $lang->msg_cannot_delete_admin = 'Административный ID не может быть удален. Пожалуйста, удалить ID из администрации и попробуйте снова.'; $lang->msg_exists_user_id = 'Этот ID уже существует. Пожалуйста, попробуйте другой.'; - $lang->msg_exists_email_address = 'Этот email адрес уже существует. Пожалуйста, попробуйте другой.'; + $lang->msg_exists_email_address = 'Этот email адрес уже зарегистрирован. Пожалуйста, попробуйте другой.'; $lang->msg_exists_nick_name = 'Этот ник уже существует. Пожалуйста, попробуйте другой.'; $lang->msg_signup_disabled = 'Вы не можете зарегистрироваться'; $lang->msg_already_logged = 'Вы уже зарегистрированы'; - $lang->msg_not_logged = 'Пожалуйста, сначала войдите'; + $lang->msg_not_logged = 'Пожалуйста, сначала сделайте вход на сайт'; $lang->msg_insert_group_name = 'Пожалуйста, введите имя группы'; - $lang->msg_check_group = 'Введите имя группы'; + $lang->msg_check_group = 'Выберите группу'; - $lang->msg_not_uploaded_image_name = 'Имя изображения не может быть зарегистрировано'; - $lang->msg_not_uploaded_image_mark = 'Марка не может быть зарегистрирована'; - $lang->msg_not_uploaded_group_image_mark = '그룹 이미지 마크를 등록할 수가 없습니다'; + $lang->msg_not_uploaded_image_name = 'Невозможно зарегистрировать фотографию профиля'; + $lang->msg_not_uploaded_image_name = 'Невозможно зарегистрировать имя фотографии'; + $lang->msg_not_uploaded_image_mark = 'Невозможно зарегистрировать марку фотографии'; + $lang->msg_not_uploaded_group_image_mark = 'Невозможно зарегистрировать марку изображения группы'; + + $lang->msg_accept_agreement = 'Вы должны принять Соглашение'; - $lang->msg_accept_agreement = 'Вы должны принять Соглашение'; + $lang->msg_user_denied = 'Введенный ID запрещен'; + $lang->msg_user_not_confirmed = 'Вы еще не прошли авторизацию, проверьте свою почту'; + $lang->msg_user_limited = 'Введенный ID возможно использовать после %s'; - $lang->msg_user_denied = 'Введенный ID сейчас запрещен'; - $lang->msg_user_not_confirmed = '아직 메일 인증이 이루어지지 않았습니다. 메일을 확인해 주세요'; - $lang->msg_user_limited = 'Введенный ID может использоваться после %s'; - - $lang->about_user_id = 'Юзер ID должен быть 3~20 знаков и содержать алфавит или цифры, начинаясь с алфафитного знака.'; - $lang->about_password = 'Пароль должен быть 6~20 знаков'; - $lang->about_user_name = 'Имя должно быть 2~20 знаков'; - $lang->about_nick_name = 'Ник должен быть 2~20 знаков'; - $lang->about_email_address = 'Email адрес используется для изменения/получения пароля после его сертификации.'; - $lang->about_homepage = 'Пожалуйста, введите, если у Вас есть веб-сайт'; + $lang->about_user_id = 'Юзер ID должен состоять из 3~20 знаков и содержать алфавит или цифры, начинаясь с алфавитного знака.'; + $lang->about_password = 'Пароль должен состоять из 6~20 знаков'; + $lang->about_user_name = 'Имя должно состоять из 2~20 знаков'; + $lang->about_nick_name = 'Ник должен состоять из 2~20 знаков'; + $lang->about_email_address = 'Email адрес используется для изменения/получения пароля после его авторизации.'; + $lang->about_homepage = 'Пожалуйста, введите, если у Вас есть вебсайт'; $lang->about_blog_url = 'Пожалуйста, введите, если у Вас есть блог'; $lang->about_birthday = 'Пожалуйста, введите Вашу дату рождения'; $lang->about_allow_mailing = "Если Вы не присоединитесь к списку рассылки, Вы не сможете получать почтовые сообщения, направленные Вашей группе"; @@ -175,37 +176,38 @@ $lang->about_column_name = 'Пожалуйста, введите английское название, которое будет использоваться в шаблоне как переменная'; $lang->about_column_title = 'Это будет отображено, когда пользователь регистрируется или изменяет/просматривает информацию пользователя'; $lang->about_default_value = 'Вы можете установить значения по умолчанию'; - $lang->about_active = 'Вам следует выбрать активные объекты для отображения на форме регистрации'; - $lang->about_form_description = 'Если Вы введете описание, оно будет отображено на форме регистрации'; - $lang->about_required = 'Сделать элемент обязательным на форме регистрации'; + $lang->about_active = 'Вам следует выбрать активные объекты для отображения в форме регистрации'; + $lang->about_form_description = 'Если Вы введете описание, оно будет отображено в форме регистрации'; + $lang->about_required = 'Сделать элемент обязательным в форме регистрации'; $lang->about_enable_openid = 'Позволить пользователям регистрироваться как OpenID'; $lang->about_enable_join = 'Позволить пользователям регистрироваться'; - $lang->about_enable_confirm = '입력된 메일 주소로 인증 메일을 보내 회원 가입을 확인 합니다'; - $lang->about_enable_ssl = '서버에서 SSL지원이 될 경우 회원가입/정보수정/로그인등의 개인정보가 서버로 보내질때 SSL(https)를 이용하도록 할 수 있습니다'; - $lang->about_limit_day = 'Вы можете ограничить дату сертификации после регистрации'; + $lang->about_enable_confirm = 'Please check if you want new members to activate their accounts via their emails.'; + $lang->about_enable_ssl = 'Personal information from Sign up/Modify Member Info/Sign in can be sent as SSL(https) mode if server provides SSL service'; + $lang->about_limit_day = 'Вы можете ограничить дату авторизации после регистрации'; $lang->about_limit_date = 'Пользователь не может войти до указанной даты'; - $lang->about_after_login_url = '로그인 후 이동할 URL을 정하실 수 있습니다. 비어 있으면 해당 페이지가 유지됩니다.'; - $lang->about_after_logout_url = '로그아웃 후 이동할 URL을 정하실 수 있습니다. 비어 있으면 해당 페이지가 유지됩니다.'; - $lang->about_redirect_url = 'Пожалуйста, введите URL, куда пользователи попадут после регистрации. Когда поле пустое, будет установлена страница предшествуящая странице регистрации.'; - $lang->about_agreement = "Регистрационное соглашение будет показано, если оно содержит текст"; + $lang->about_after_login_url = 'Возможен переход на указанный URL после логин. Если не укажете, то данная страница отобразиться.'; + $lang->about_after_logout_url = 'Возможен переход на указанный URL после выхода. Если не укажете, то данная страница отобразиться.'; + $lang->about_redirect_url = 'Пожалуйста, введите URL, куда пользователи попадут после регистрации. Когда поле пустое, будет установлена страница предшествующая странице регистрации.'; + $lang->about_agreement = 'Регистрационное соглашение будет показано, если оно содержит текст'; - $lang->about_image_name = "Позволить пользователям использовать изображение вместо текста"; - $lang->about_image_mark = "Позволить пользователям использовать марку перед их именами"; - $lang->about_group_image_mark = '사용자의 이름앞에 그룹 마크를 달 수 있습니다'; + $lang->about_image_name = 'Возможно использование изображение вместо текста'; + $lang->about_image_mark = 'Возможно использование марки перед именем'; + $lang->about_group_image_mark = 'Возможно использование групповой марки перед именем'; $lang->about_profile_image = 'Позволить пользователям использовать изображения профиля'; - $lang->about_accept_agreement = "Я прочитал соглашение полностью и согласен"; + $lang->about_signature_max_height = 'Возможно установить лимит подписи. (0 Если оставите пустым, то лимита не будет.)'; + $lang->about_accept_agreement = 'Я прочитал соглашение полностью и согласен'; - $lang->about_member_default = 'Это будет установлено как стандартная группа при регистрации'; + $lang->about_member_default = 'При регистрации устанавливается стандартная группа'; - $lang->about_openid = 'Когда Вы регистрируетесь как OpenID, базовая информация такая как ID или email адрес будет сохранена на сайте, но пароль и менеджмент сертификации будет произведен над текущим OpenID'; - $lang->about_openid_leave = 'Покидание пользователей с OpenID означает удаление Вашей информации пользователя на сайте.
Если Вы войдете после покидания, это будет разпознано как новый пользователь, поэтому доступ к написанным Вами прежде статьям будет закрыт.'; + $lang->about_openid = 'При регистраци как OpenID, основнаая информация (ID или email адрес) будет сохранена на сайте, но операции с паролем и авторизацией будут произведены над текущим OpenID в представленном сервисе'; + $lang->about_openid_leave = 'Удаление аккаунта с OpenID производит удаление Вашей информации пользователя на сайте.
Если Вы войдете после удаления аккаунта, Вы будете разпознаны как новый пользователь и доступ к написанным Вами ранее записям будет закрыт.'; + $lang->about_find_member_account = 'ID и пароль при регистрации будут посланы Вам по имейл адресу.
Введите имейл адрес, указанный при регистрации и кликните на кнопку "Поиск ID/пароль".
'; $lang->about_member = "Этот модуль служит для создания/изменения/удаления пользователей, управления их группами и формой регистрации.\nВы можете управлять пользователями посредством создания новых групп, и получить дополнительную информацию, управляя формой регистрации"; - $lang->about_find_member_account = 'Ваша информация аккаунта будет направлена на зарегистрированный email.
Пожалуйста, введите email адрес, который Вы ввели при регистрации и нажмите кнопку "Найти Информацию Аккаунта".
'; - $lang->about_ssl_port = 'Please input if you are using different SSL port with default one'; - $lang->add_openid = 'Add OpenID'; + $lang->about_ssl_port = 'Please input if you are using different SSL port with default one'; + $lang->add_openid = 'Добавить OpenID'; - $lang->about_resend_auth_mail = 'You can request for authentication mail if you have failed before.'; - $lang->no_article = 'There exists no article'; + $lang->about_resend_auth_mail = 'Вы можете получить снова письмо для авторизации, если еще не получили.'; + $lang->no_article = 'Записей нет'; ?> diff --git a/modules/member/member.controller.php b/modules/member/member.controller.php index 47b64aed9..faa4c4f53 100644 --- a/modules/member/member.controller.php +++ b/modules/member/member.controller.php @@ -1260,8 +1260,15 @@ $args->group_srl = $group_srl; if($site_srl) $args->site_srl = $site_srl; + $oModel =& getModel('member'); + $groups = $oModel->getMemberGroups($member_srl, $site_srl, true); + if($groups[$group_srl]) return new Object(); + // 추가 - return executeQuery('member.addMemberToGroup',$args); + $output = executeQuery('member.addMemberToGroup',$args); + $output2 = ModuleHandler::triggerCall('member.addMemberToGroup', 'after', $args); + + return $output; } /** diff --git a/modules/member/member.model.php b/modules/member/member.model.php index 9282acc05..997d65c36 100644 --- a/modules/member/member.model.php +++ b/modules/member/member.model.php @@ -287,9 +287,9 @@ /** * @brief member_srl이 속한 group 목록을 가져옴 **/ - function getMemberGroups($member_srl, $site_srl = 0) { + function getMemberGroups($member_srl, $site_srl = 0, $force_reload = false) { static $member_groups = array(); - if(!$member_groups[$member_srl][$site_srl]) { + if(!$member_groups[$member_srl][$site_srl] || $force_reload) { $args->member_srl = $member_srl; $args->site_srl = $site_srl; $output = executeQuery('member.getMemberGroups', $args); diff --git a/modules/member/tpl/insert_member.html b/modules/member/tpl/insert_member.html index e20d7fec4..9e5ec8f4d 100644 --- a/modules/member/tpl/insert_member.html +++ b/modules/member/tpl/insert_member.html @@ -75,7 +75,8 @@
{$lang->birthday}
- + +

{$lang->about_birthday}

@@ -114,7 +115,9 @@
{$lang->limit_date}
- + + +

{$lang->about_limit_date}

@@ -275,6 +278,9 @@ }; $.extend(option,$.datepicker.regional['{$lang_type}']); $(".inputDate").datepicker(option); + $(".dateRemover").click(function() { + $(this).parent().prevAll('input').val(''); + return false;}); }); })(jQuery); diff --git a/modules/menu/conf/info.xml b/modules/menu/conf/info.xml index f983a0ead..e2950189d 100644 --- a/modules/menu/conf/info.xml +++ b/modules/menu/conf/info.xml @@ -14,7 +14,7 @@ This module is for creating/managering menues that linking layouts or modules. Module này dành cho việc tạo và quản lý Menu sẽ liên kết với giao diện hoặc Mudule. Este módulo es para crear/manejar los menús que que son conectados con los diseños o módulos. - Этот модуль служит создания/управления меню, которые соединяют лейауты и модули. + Этот модуль служит для создания/управления меню, соединяюще лейауты и модули. 可建立並管理連結版面和模組的選單。 0.1 2007-02-28 diff --git a/modules/menu/lang/ru.lang.php b/modules/menu/lang/ru.lang.php index 42a439da0..d04002fc5 100644 --- a/modules/menu/lang/ru.lang.php +++ b/modules/menu/lang/ru.lang.php @@ -6,13 +6,13 @@ **/ $lang->cmd_menu_insert = 'Создать меню'; - $lang->cmd_menu_management = 'Менеджмент меню'; + $lang->cmd_menu_management = 'Управление меню'; $lang->menu = 'Меню'; $lang->menu_count = 'Меню No.'; - $lang->menu_management = 'Менеджмент меню'; - $lang->depth = 'Шаг'; - $lang->parent_menu_name = 'Имя родительского меню'; + $lang->menu_management = 'Управление меню'; + $lang->depth = 'Ступень'; + $lang->parent_menu_name = 'Имя верхнего меню'; $lang->menu_name = 'Имя меню'; $lang->menu_srl = 'SRL меню'; $lang->menu_id = 'ID меню'; @@ -22,7 +22,7 @@ $lang->menu_img_btn = 'Изображение кнопки'; $lang->menu_normal_btn = 'Обычное'; $lang->menu_hover_btn = 'Мышь над'; - $lang->menu_active_btn = 'Когда выбрано'; + $lang->menu_active_btn = 'При выборе'; $lang->menu_group_srls = 'Группы с доступом'; $lang->layout_maker = "Маркет лейаута"; $lang->layout_history = "История обновлений"; @@ -34,14 +34,14 @@ $lang->cmd_make_child = 'Добавть дочернее меню'; $lang->cmd_move_to_installed_list = "Просмотреть созданные меню"; $lang->cmd_enable_move_menu = "Переместить меню (Перетащите верхнее меню после выделения)"; - $lang->cmd_search_mid = "Поиск меню id"; + $lang->cmd_search_mid = "Поиск mid"; - $lang->msg_cannot_delete_for_child = 'Невозможно удалить меню с дочерними меню.'; + $lang->msg_cannot_delete_for_child = 'Невозможно удалить меню с дочерними меню'; - $lang->about_title = 'Пожалуйста, введите название меню, которое легко проверить при подключению к модулю.'; - $lang->about_menu_management = "Управление меню позволяет Вам заключить меню в вабранный лейаут.\nВы можете создать меню до установленной грубины и ввести информацию детально посредством целчка по нему.\nМеню будет разкрыто щелчком по изображению папки.\nЕсли меню не отображается нормально, обновите информацию щелчком по кнопке \"Пересоздать файл кеша\".\n* Меню, созданное за пределами лимита глубины может отображаться неверно."; + $lang->about_title = 'Пожалуйста, введите название меню, которое легко проверить при подключению к модулю'; + $lang->about_menu_management = "Управление меню позволяет Вам заключить меню в вабранный лейаут.\nВы можете создать меню до установленной грубины и ввести информацию детально посредством целчка по нему\nМеню будет разкрыто щелчком по изображению папки.\nЕсли меню не отображается нормально, обновите информацию щелчком по кнопке \"Пересоздать файл кеша\".\n* Меню, созданное за пределами лимита глубины может отображаться неверно."; $lang->about_menu_name = 'Это имя будет показано, если это не административная книпка или кнопка с изображением.'; - $lang->about_menu_url = "Это URL, связанный с меню.
Вы можете ввести только id значение к ссылке на другой модуль.
Если содержания нет, ничего не произойдет при щелчке по меню."; + $lang->about_menu_url = "Это URL, связанный с меню.
Вы можете ввести только ID значение к ссылке на другой модуль.
Если содержания нет, ничего не произойдет при щелчке по меню."; $lang->about_menu_open_window = 'Вы можете присвоить это для открытия ссылки в новом окне при щелчке по меню.'; $lang->about_menu_expand = 'Это позволяет меню оставаться раскрытым, когда древовидное меню (tree_menu.js) используется.'; $lang->about_menu_img_btn = 'Если Вы регистрируете кнопку с изображением, изображение автоматически заменит текстовую кнопку, и будет показано в лейауте.'; @@ -49,5 +49,5 @@ $lang->about_menu = "Модуль меню поможет Вам создать полноценный сайт посредством удобного менеджмента меню, которое расставляет созданные модули и ссылки в лейауты без всякой ручной работы.\nМеню не является менеджером сайта, но оно содержит информацию, которая может связываться с модулями и лейаутами так, что Вы можете выразить различные виды меню."; - $lang->alert_image_only = "이미지 파일만 등록가능합니다."; + $lang->alert_image_only = "Возможна регистрация только картинок"; ?> diff --git a/modules/menu/tpl/js/menu_admin.js b/modules/menu/tpl/js/menu_admin.js index 8afbda965..c93dc1605 100644 --- a/modules/menu/tpl/js/menu_admin.js +++ b/modules/menu/tpl/js/menu_admin.js @@ -2,7 +2,7 @@ /* 메뉴 삭제 */ function doDeleteMenu(menu_srl) { - var fo_obj = xGetElementById("fo_menu"); + var fo_obj = jQuery("#fo_menu")[0]; if(!fo_obj) return; fo_obj.menu_srl.value = menu_srl; procFilter(fo_obj, delete_menu); @@ -26,7 +26,7 @@ function doInsertMenuItem(parent_srl) { /* 메뉴 클릭시 적용할 함수 */ function doGetMenuItemInfo(menu_id, obj) { // menu, menu_id, node_srl을 추출 - var fo_obj = xGetElementById("fo_menu"); + var fo_obj = jQuery("#fo_menu")[0]; var node_srl = 0; var parent_srl = 0; @@ -39,9 +39,7 @@ function doGetMenuItemInfo(menu_id, obj) { } } - var params = new Array(); - params["menu_item_srl"] = node_srl; - params["parent_srl"] = parent_srl; + var params = {menu_item_srl:node_srl, parent_srl:parent_srl}; // 서버에 요청하여 해당 노드의 정보를 수정할 수 있도록 한다. var response_tags = new Array('error','message','tpl'); @@ -49,62 +47,35 @@ function doGetMenuItemInfo(menu_id, obj) { } /* 서버로부터 받아온 메뉴 정보를 출력 */ -/* -xAddEventListener(document,'mousedown',checkMousePosition); -var _xPos = 0; -var _yPos = 0; -function checkMousePosition(e) { - var evt = new xEvent(e); - _xPos = evt.pageX; - _yPos = evt.pageY; -} -*/ - function hideCategoryInfo() { jQuery("#menu_zone_info").html(""); } function completeGetMenuItemTplInfo(ret_obj, response_tags) { - var obj = xGetElementById('menu_zone_info'); + var obj = jQuery('#menu_zone_info'); + var sc_top = jQuery(document).scrollTop(); - if(xScrollTop()>200) { - obj.style.marginTop = ( xScrollTop() - 210 )+'px'; + if(sc_top > 200) { + obj.css('margin-top', (sc_top-210)+'px'); } else { - obj.style.marginTop = '0px'; + obj.css('margin-top', 0); } var tpl = ret_obj['tpl']; - xInnerHtml(obj, tpl); - obj.style.display = 'block'; - - var fo_obj = xGetElementById("fo_menu"); - - /* - var x = _xPos + 50; - var y = _yPos - xHeight(obj)/2 + 80 + xScrollTop(); - xLeft(obj, x); - xTop(obj, y); - xRemoveEventListener(document,'mousedown',checkMousePosition); - - if(xGetElementById('cBody') && xHeight('cBody')< y+xHeight(obj)+50) { - xHeight('cBody', y + xHeight(obj) + 50); - } - - if(typeof('fixAdminLayoutFooter')=="function") fixAdminLayoutFooter(); - */ + obj.html(tpl).show(); } /* 메뉴를 드래그하여 이동한 후 실행할 함수 , 이동하는 item_srl과 대상 item_srl을 받음 */ function doMoveTree(menu_id, source_item, target_item) { - var fo_obj = xGetElementById("fo_move_menu"); + var fo_obj = jQuery("#fo_move_menu")[0]; fo_obj.menu_id.value = menu_id; fo_obj.source_item.value = source_item; fo_obj.target_item.value = target_item; // 이동 취소를 선택하였을 경우 다시 그림;; if(!procFilter(fo_obj, move_menu_item)) { - var params = new Array(); - params["xml_file"] = xGetElementById('fo_menu').xml_file.value; + var params = []; + params["xml_file"] = jQuery('#fo_menu')[0].xml_file.value; params["source_item"] = source_item; completeMoveMenuItem(params); } @@ -114,7 +85,7 @@ function completeMoveMenuItem(ret_obj) { var source_item_srl = ret_obj['source_item_srl']; var xml_file = ret_obj['xml_file']; - var fo_menu = xGetElementById("fo_menu"); + var fo_menu = jQuery("#fo_menu")[0]; if(!fo_menu) return; var title = fo_menu.title.value; @@ -133,7 +104,7 @@ function doReloadTreeMenu(menu_srl) { /* 메뉴 삭제 */ function doDeleteMenuItem(menu_item_srl) { - var fo_obj = xGetElementById("fo_menu"); + var fo_obj = jQuery("#fo_menu")[0]; if(!fo_obj) return; procFilter(fo_obj, delete_menu_item); @@ -148,7 +119,7 @@ function completeDeleteMenuItem(ret_obj) { alert(ret_obj['message']); loadTreeMenu(xml_file, 'menu', 'menu_zone_menu', menu_title, '', doGetMenuItemInfo, menu_item_srl, doMoveTree); - xInnerHtml("menu_zone_info", ""); + jQuery('#menu_zone_info').html(''); } @@ -159,7 +130,7 @@ function doInsertMid(mid, menu_id) { return; } - var fo_obj = opener.xGetElementById("fo_menu"); + var fo_obj = opener.document.getElementById("fo_menu"); if(!fo_obj) { window.close(); return; @@ -174,7 +145,7 @@ function doMenuUploadButton(obj) { // 이미지인지 체크 if(!/\.(gif|jpg|jpeg|png)$/i.test(obj.value)) return alert(alertImageOnly); - var fo_obj = xGetElementById("fo_menu"); + var fo_obj = jQuery("#fo_menu")[0]; fo_obj.act.value = "procMenuAdminUploadButton"; fo_obj.target.value = obj.name; fo_obj.submit(); @@ -185,21 +156,21 @@ function doMenuUploadButton(obj) { /* 메뉴 이미지 업로드 후처리 */ function completeMenuUploadButton(target, filename) { var column_name = target.replace(/^menu_/,''); - var fo_obj = xGetElementById("fo_menu"); - var zone_obj = xGetElementById(target+'_zone'); - var img_obj = xGetElementById(target+'_img'); + var fo_obj = jQuery('#fo_menu')[0]; + var zone_obj = jQuery('#'+target+'_zone'); + var img_obj = jQuery('#'+target+'_img'); fo_obj[column_name].value = filename; var img = new Image(); img.src = filename; - img_obj.src = img.src; - zone_obj.style.display = "block"; + img_obj.attr('src', img.src); + zone_obj.show(); } /* 업로드된 메뉴 이미지 삭제 */ function doDeleteButton(target) { - var fo_obj = xGetElementById("fo_menu"); + var fo_obj = jQuery("#fo_menu")[0]; var col_name = target.replace(/^menu_/,''); @@ -216,22 +187,15 @@ function doDeleteButton(target) { function completeDeleteButton(ret_obj, response_tags) { var target = ret_obj['target']; - var column_name = target.replace(/^menu_/,''); - var fo_obj = xGetElementById("fo_menu"); - var zone_obj = xGetElementById(target+'_zone'); - var img_obj = xGetElementById(target+'_img'); - fo_obj[column_name].value = ""; - img_obj.src = ""; - zone_obj.style.display = "none"; + jQuery('#fo_menu')[0][column_name].value = ''; + jQuery('#'+target+'_img').attr('src', ''); + jQuery('#'+target+'_zone').hide(); } /* 메뉴 입력후 */ function completeInsertMenu(ret_obj) { var menu_srl = ret_obj['menu_srl']; alert(ret_obj['message']); location.href = current_url.setQuery('act','dispMenuAdminContent'); - - //var url = current_url.setQuery('act','dispMenuAdminManagement').setQuery('menu_srl',menu_srl); - //window.open(url); } diff --git a/modules/menu/tpl/js/menu_tree.js b/modules/menu/tpl/js/menu_tree.js index cab534449..adb56f8d1 100644 --- a/modules/menu/tpl/js/menu_tree.js +++ b/modules/menu/tpl/js/menu_tree.js @@ -169,5 +169,6 @@ function completeInsertMenuItem(ret_obj) { } function doMoveMenuInfo() { - xAddEventListener(window,'load', function() { window.document.body.appendChild(xGetElementById('fo_menu')); xGetElementById('menu_zone_info').style.width = '550px'; } ); + var $ = jQuery; + $(function(){ $('#fo_menu').appendTo(document.body); $('#menu_zone_info').css('width', '550px'); }); } diff --git a/modules/module/lang/en.lang.php b/modules/module/lang/en.lang.php index 909ed95a9..467471006 100644 --- a/modules/module/lang/en.lang.php +++ b/modules/module/lang/en.lang.php @@ -27,7 +27,7 @@ $lang->skin_history = 'Update history'; $lang->module_copy = "Duplicate Module"; $lang->module_selector = "Module Selector"; - $lang->do_selected = "You would..."; + $lang->do_selected = "I want to"; $lang->bundle_setup = "Bundle Setup"; $lang->bundle_addition_setup = "Bundle Additional Setup"; $lang->bundle_grant_setup = "Bundle Permission Setup"; diff --git a/modules/module/lang/ru.lang.php b/modules/module/lang/ru.lang.php index 2a225ab50..243c661a1 100644 --- a/modules/module/lang/ru.lang.php +++ b/modules/module/lang/ru.lang.php @@ -13,7 +13,7 @@ $lang->add_shortcut = "Добавить ярлыки"; $lang->module_action = "Действия"; $lang->module_maker = "Разработчик модуля"; - $lang->module_license = 'License'; + $lang->module_license = 'Лицензия'; $lang->module_history = "История обновлений"; $lang->category_title = "Название категории"; $lang->header_text = 'Верхний колонтитул'; @@ -26,23 +26,23 @@ $lang->skin_license = 'License'; $lang->skin_history = 'История обновлений'; $lang->module_selector = "Module Selector"; - $lang->do_selected = "선택된 것들을..."; + $lang->do_selected = "Выбранные..."; $lang->bundle_setup = "일괄 기본 설정"; $lang->bundle_addition_setup = "일괄 추가 설정"; $lang->bundle_grant_setup = "일괄 권한 설정"; - $lang->lang_code = "언어 코드"; - $lang->filebox = "파일박스"; + $lang->lang_code = "Код языка"; + $lang->filebox = "Файлбокс"; - $lang->access_type = '접속 방법'; - $lang->access_domain = 'Domain 접속'; - $lang->access_vid = 'Site ID 접속'; + $lang->access_type = 'Способ соединения'; + $lang->access_domain = 'Domain соединения'; + $lang->access_vid = 'Site ID соединение'; $lang->about_vid = '별도의 도메인이 아닌 http://XE주소/ID 로 접속할 수 있습니다. 모듈명(mid)와 중복될 수 없습니다.
첫글자는 영문으로 시작해야 하고 영문과 숫자 그리고 _ 만 사용할 수 있습니다'; $lang->msg_already_registed_vid = '이미 등록된 사이트 ID 입니다. 게시판등의 mid와도 중복이 되지 않습니다. 다른 ID를 입력해주세요.'; $lang->msg_already_registed_domain = '이미 등록된 도메인입니다. 다른 도메인을 사용해주세요'; $lang->module_copy = "Копировать модуль"; - $lang->header_script = "헤더 스크립트"; + $lang->header_script = "Скрипт Header"; $lang->about_header_script = "html의 <header>와 </header> 사이에 들어가는 코드를 직접 입력할 수 있습니다.
<script, <style 또는 <meta 태그등을 이용하실 수 있습니다"; $lang->grant_access = "Access"; @@ -60,12 +60,12 @@ $lang->cmd_manage_grant = 'Управление правами доступа'; $lang->cmd_manage_skin = 'Управление скинами'; $lang->cmd_manage_document = 'Управление статьями'; - $lang->cmd_find_module = '모듈 찾기'; + $lang->cmd_find_module = 'Искать модуль'; $lang->cmd_find_langcode = 'Find lang code'; $lang->msg_new_module = "Создать новый модуль"; $lang->msg_update_module = "Изменить модуль"; - $lang->msg_module_name_exists = "Имя уже существует. Пожалуйста, попробуйте другое."; + $lang->msg_module_name_exists = "Имя уже существует. Пожалуйста, попробуйте другое"; $lang->msg_category_is_null = 'Зарегистрированной категории не существует.'; $lang->msg_grant_is_null = 'Списка для управления правами доступа не существует.'; $lang->msg_no_checked_document = 'Нет выбранных статей.'; // translator's note: выше... diff --git a/modules/module/module.model.php b/modules/module/module.model.php index df5602383..fe3d7a758 100644 --- a/modules/module/module.model.php +++ b/modules/module/module.model.php @@ -83,7 +83,9 @@ $path = preg_replace('/\/$/','',$url_info['path']); $sites_args->domain = sprintf('%s%s%s', $hostname, $url_info['port']&&$url_info['port']!=80?':'.$url_info['port']:'',$path); $output = executeQuery('module.getSiteInfoByDomain', $sites_args); - } else { + } + if(!$output || !$output->data) + { if(!$vid) $vid = $mid; if($vid) { $vid_args->domain = $vid; @@ -127,7 +129,6 @@ $output = executeQuery('module.getSiteInfo', $args); } } - $module_info = $output->data; if(!$module_info->module_srl) return $module_info; if(is_array($module_info) && $module_info->data[0]) $module_info = $module_info[0]; diff --git a/modules/module/tpl/module_selector.html b/modules/module/tpl/module_selector.html index d6b163ad4..784908e19 100644 --- a/modules/module/tpl/module_selector.html +++ b/modules/module/tpl/module_selector.html @@ -51,10 +51,10 @@ {@ $_idx =0; } + {@ $browser_title = str_replace("'", "\\'", htmlspecialchars($v->browser_title)); } {$k} {$v->browser_title} - -
{$type=='single'?$lang->cmd_select:$lang->cmd_insert} + {$type=='single'?$lang->cmd_select:$lang->cmd_insert} {@ $_idx ++; } diff --git a/modules/opage/opage.view.php b/modules/opage/opage.view.php index fdce5c37c..3c122c18d 100644 --- a/modules/opage/opage.view.php +++ b/modules/opage/opage.view.php @@ -37,7 +37,6 @@ else $content = $this->executeFile($path, $caching_interval, $cache_file); } - Context::set('opage_content', $content); // 결과 출력 템플릿 지정 @@ -110,7 +109,7 @@ // 상대경로를 절대경로로 변경 $path_info = pathinfo($path); - $this->path = realpath($path_info['dirname']).'/'; + $this->path = str_replace('\\', '/', realpath($path_info['dirname'])).'/'; $content = preg_replace_callback('/(src=|href=|url\()("|\')?([^"\'\)]+)("|\'\))?/is',array($this,'_replacePath'),$content); $content = preg_replace_callback('/( -
{$val->browser_title} ({$val->mid})
@@ -31,7 +30,6 @@ {$config->point_name} - diff --git a/modules/point/tpl/point_module_config.html b/modules/point/tpl/point_module_config.html index 43bbea74e..030c18b0f 100644 --- a/modules/point/tpl/point_module_config.html +++ b/modules/point/tpl/point_module_config.html @@ -26,6 +26,14 @@
{$lang->point_read_document}
{$module_config['point_name']} + +
{$lang->point_voted}
+ {$module_config['point_name']} + + +
{$lang->point_blamed}
+ {$module_config['point_name']} + diff --git a/modules/rss/lang/ru.lang.php b/modules/rss/lang/ru.lang.php index 78e9e062c..f6a09f377 100644 --- a/modules/rss/lang/ru.lang.php +++ b/modules/rss/lang/ru.lang.php @@ -6,20 +6,31 @@ **/ // главные слова - $lang->rss_disable = "Отключить RSS"; + $lang->feed = 'Создать(Feed)'; + $lang->total_feed = 'Общий Feed'; + $lang->rss_disable = "Отключить RSS"; + $lang->feed_copyright = 'Копирайт'; + $lang->feed_document_count = 'Количество записей на страницу'; + $lang->feed_image = 'Картинка Feed'; $lang->rss_type = "Тип RSS"; - $lang->open_rss = 'Открыть RSS'; + $lang->open_rss = 'Показать RSS'; $lang->open_rss_types = array( - 'Y' => 'Открыть все', - 'H' => 'Открыть резюме', - 'N' => 'Не открывать', + 'Y' => 'Показать все', + 'H' => 'Показать выдержку', + 'N' => 'Не показывать', ); - - // для описаний + $lang->open_feed_to_total = 'Включено в общий Feed'; + + // для описаний $lang->about_rss_disable = "Если выбрано, RSS будет отключен."; $lang->about_rss_type = "Вы можете присвоить тип RSS."; $lang->about_open_rss = 'Вы можете выбрать для того, чтобы RSS доступен публично.\nНезависимо от разрешений для статьи, RSS будет доступна публично согласно ее настройке.'; + $lang->about_feed_description = '발행될 피드에 대한 설명을 입력하실 수 있습니다. 설명을 입력하지 않으실 경우, 해당 모듈에 설정된 관리용 설명이 포함됩니다.'; + $lang->about_feed_copyright = '발행될 피드에 대한 저작권 정보를 입력하실 수 있습니다.'; + $lang->about_part_feed_copyright = '입력하지 않으면 전체 피드 저작권 설정과 동일하게 적용됩니다.'; + $lang->about_feed_document_count = '피드 한 페이지에 공개되는 글 수. (기본 값 : 15)'; - // для ошибок - $lang->msg_rss_is_disabled = "Функция RSS быключена."; + // для ошибок + $lang->msg_rss_is_disabled = "Функция RSS выключена."; + $lang->msg_rss_invalid_image_format = 'Неправильный тип картинки\nПоддерживаются только JPEG, GIF, PNG файлы'; ?> diff --git a/modules/trackback/tpl/js/trackback_admin.js b/modules/trackback/tpl/js/trackback_admin.js index 223352e4f..9fa923099 100644 --- a/modules/trackback/tpl/js/trackback_admin.js +++ b/modules/trackback/tpl/js/trackback_admin.js @@ -1,9 +1,11 @@ function doCheckAll(bToggle) { - var fo_obj = xGetElementById('fo_list'); + var fo_obj = jQuery('#fo_list')[0], el = null; if(typeof(bToggle) == "undefined") bToggle = false; - for(var i=0;i').val(attrs[i].value).prependTo(fo_widget); - }else{ - if(!input.val() && attrs[i].value ){ - input.val(attrs[i].value); - } - } - } - */ } /* 페이지 모듈에서 내용의 위젯을 더블클릭하여 수정하려고 할 경우 */ @@ -183,15 +166,6 @@ function doFillWidgetVars() { } -/* - var marginLeft = 0; - if(selected_node.style.marginLeft) marginLeft = parseInt(selected_node.style.marginLeft.replace(/px$/,''),10); - var marginRight = 0; - if(selected_node.style.marginRight) marginRight = parseInt(selected_node.style.marginRight.replace(/px$/,''),10); - var border = 0; - if(selected_node.style.border) border= parseInt(selected_node.style.boarder.replace(/px$/,''),10); -*/ - var style = selected_node.getAttribute("style"); if(typeof(style)=="object") style = style["cssText"]; fo_obj.style.value = style; @@ -231,7 +205,7 @@ function insertSelectedModule(id, module_srl, mid, browser_title) { // 위젯의 대상 모듈 입력기 (다중 선택) function insertSelectedModules(id, module_srl, mid, browser_title) { - var sel_obj = xGetElementById('_'+id); + var sel_obj = jQuery('#_'+id)[0]; for(var i=0;iContent 위젯 Content Nội dung + Содержание 全局内容控件 內容 コンテンツウィジェット 게시판, 코멘트, 첨부파일 등 Content를 출력하는 위젯입니다. This widget displays Content such as articles, comments, or attached files. Widget này sẽ hiển thị những bài viết, bình luận, File đính kèm. + This widget displays Content such as articles, comments, or attached files. 以各种样式显示主题,评论,附件等站内内容的全局控件。 這個 Widget 可輸出討論板、評論,附加檔案等內容。 掲示板の書き込み、コメント、添付ファイルなどコンテンツを出力するウィジェットです。 @@ -31,6 +33,7 @@ select 추출대상 Target + Target Khu vực 对象 目標 @@ -39,6 +42,7 @@ document 게시물 Article + Article Bài viết 主题 主題 @@ -49,6 +53,7 @@ 댓글 Comment Bình luận + Comment 评论 評論 コメント @@ -58,6 +63,7 @@ 첨부이미지 Attached Image Hình đính kèm + Attached Image 图片 圖片 添付イメージ @@ -67,6 +73,7 @@ 트랙백 Trackback Liên kết Web + Trackback 引用 引用 トラックバック @@ -76,6 +83,7 @@ 피드 (RSS/ATOM) Feed (RSS/ATOM) Feed (RSS/ATOM) + Feed (RSS/ATOM) Feed (RSS/ATOM) Feed (RSS/ATOM) Feed (RSS/ATOM) @@ -86,6 +94,7 @@ 내용형태 Content Type Kiểu hiển thị + Content Type 内容样式 內容樣式 内容のタイプ @@ -94,6 +103,7 @@ 제목 Title Tiêu đề + Title 标题 標題 タイトル @@ -101,8 +111,9 @@ image_title 이미지+제목 - Image+Title + Image+Title Hình ảnh+Tiêu đề + Image+Title 图片+标题 圖片+標題 画像+タイトル @@ -112,6 +123,7 @@ 겔러리 Gallery Slide Show + Gallery 相册 相簿 ギャラリー @@ -121,6 +133,7 @@ 이미지+제목+내용 Image+Title+Content Hình ảnh+Tiêu đề+Nội dung + Image+Title+Content 图片+标题+内容 圖片+標題+內容 画像+タイトル+内容 @@ -131,6 +144,7 @@ 탭형태 Tab Type Kiểu Tab + Tab Type 选项卡样式 分頁樣式 タブのスタイル @@ -139,6 +153,7 @@ 없음 None Không + None なし @@ -148,6 +163,7 @@ 상단 탭형 Upper Tab Type Kiểu Tab trên + Upper Tab Type 顶端选项卡 頂端分頁 上段配置型タブ @@ -157,6 +173,7 @@ 왼쪽 탭형 Left Tab Type Kiểu Tab trái + Left Tab Type 左侧选项卡 左側分頁 左側の配置型タブ @@ -166,7 +183,7 @@ select-multi-order 표시항목 및 순서 - Display Target & Order + Display Target and Order Hiển thị khu vực và thứ tự 显示项及顺序 顯示項目順序 @@ -176,6 +193,7 @@ 제목 Title Tiêu đề + Title 标题 標題 タイトル @@ -185,6 +203,7 @@ 섬네일 Thumbnail Hình nhỏ + Thumbnail 缩略图 縮圖 サムネール @@ -194,6 +213,7 @@ 등록일 Regdate Ngày gửi + Regdate 发布日期 發表日期 登録日 @@ -203,6 +223,7 @@ 글쓴이 Author Người gửi + Author 发布者 作者 登録者 @@ -211,6 +232,7 @@ content 내용 Content + Content Nội dung 内容 內容 @@ -223,6 +245,7 @@ 게시판 이름 표시 Display Article Name Tên bài viết + Display Article Name 显示版面名称 討論板名稱 掲示板名の表示 @@ -231,6 +254,7 @@ 출력 Display Hiển thị + Display 显示 顯示 表示 @@ -240,6 +264,7 @@ 출력하지 않음 No Display Không hiển thị + No Display 不显示 不顯示 表示しない @@ -251,6 +276,7 @@ 댓글수 표시 Comment Count Số bình luận + Comment Count 显示评论数 評論數 コメント数 @@ -259,6 +285,7 @@ 출력 Display Hiển thị + Display 显示 顯示 表示 @@ -268,6 +295,7 @@ 출력하지 않음 No Display Không hiển thị + No Display 不显示 不顯示 表示しない @@ -279,6 +307,7 @@ 엮인글수 표시 Trackback Liên kết Web + Trackback 显示引用数 引用數 トラックバック数の表示 @@ -287,6 +316,7 @@ 출력 Display Hiển thị + Display 显示 顯示 表示 @@ -296,6 +326,7 @@ 출력하지 않음 No Display Không hiển thị + No Display 不显示 不顯示 表示しない @@ -306,6 +337,7 @@ 분류 표시 Category Thể loại + Категория 显示分类 分類 カテゴリ表示 @@ -314,6 +346,7 @@ 출력 Display Hiển thị + Display 显示 顯示 表示 @@ -323,6 +356,7 @@ 출력하지 않음 No Display Không hiển thị + No Display 不显示 不顯示 表示しない @@ -333,6 +367,7 @@ 아이콘 표시 Icon Icon + Иконка 显示图标 圖示 アイコン表示 @@ -341,6 +376,7 @@ 출력 Display Hiển thị + Display 显示 顯示 表示 @@ -350,6 +386,7 @@ 출력하지 않음 No Display Không hiển thị + No Display 不显示 不顯示 表示しない @@ -366,7 +403,7 @@ Target to be sorted Phân loại Objetivo para ser ordenados - Назначение для сортировки + Предмет для сортировки 排列順序 등록된 순서 또는 변경된 순서로 정렬을 할 수 있습니다. 可以按照指定的顺序进行排序。 @@ -384,7 +421,7 @@ Newest Submitted Order Bài mới gửi Orden de agregados recientemente - Порядок размещенных статей + Порядок последних записей 最新發表 @@ -395,7 +432,7 @@ Newest Modified Order Bài mới sửa Orden de modificados recientemente - Порядок измененных статей + Порядок последних измененных записей 最新修改
@@ -494,7 +531,7 @@ You can set the width of image. (100 as default) Bạn có thể đặt độ rộng của hình. (Mặc định là 100px) Usted puede definir el ancho de la imagen. (predefinido:100px) - Вы можете установить ширину изображения. (стандарт: 100px) + Вы можете установить ширину изображения(стандарт: 100px) 指定顯示的圖片寬度。(預設是100) @@ -511,7 +548,7 @@ 可以指定图片高度。(默认为75px) You can set the height of image. (75 as default) Bạn có thể đặt độ cao của hình. (Mặc định là 75px) - Вы можете установить вытсоту изображения. (стандарт: 75px) + Вы можете установить высоту изображения (стандарт: 75px) 指定圖片高度。(預設是75px) @@ -522,7 +559,7 @@ Number of Images Số hình Número de imágenes - Число изображений (колонка) + Число изображений по горизонтали 橫向圖片數 출력될 가로 이미지의 수를 정하실 수 있습니다. (기본 5개) 表示する横並びのイメージ数を指定します(デフォルト5個)。 @@ -530,7 +567,7 @@ You can set the number of images to display. (5 as default) Bạnc ó thể đặt số hình ảnh sẽ hiển thị. (Mặc định là 5 hình) Usted puede definir el múmero de imágenes a mostrar. (predefinido: 5) - Вы можете установить число изображений для показа. (стандарт: 5) + Вы можете установить число изображений по горизонтали (стандарт: 5) 指定要顯示的橫向圖片數。(預設是5個) @@ -550,53 +587,53 @@ You can set the number of articles to be displayed. (default is 5) Bạn có thể đặt số bài hiển thị. (Mặc định là 5) Usted puede definir el número de los documentos a mostrar. (predefinido: 5) - Вы можете выбрать число списка статей для отображения. (стандарт: 5) + Вы можете выбрать число списка (стандарт: 5) 設置要顯示的目錄數。(預設是5個) select - 페이지수 - Page - 分页 - 頁數 - Page - Trang - ページ数 + 페이지수 + Page + 分页 + 頁數 + Число страниц + Trang + ページ数 1 1 - 1 - 1 - 1 - 1 - 1 - 1 + 1 + 1 + 1 + 1 + 1 + 1 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 3 - 3 - 3 - 3 - 3 - 3 - 3 - 3 + 3 + 3 + 3 + 3 + 3 + 3 + 3 페이지수 2이상일 경우 이전/다음 버튼이 나타납니다. - Prev/Next buttons will appear when there are more than 2 pages. - 分页数在2以上时,将会出现上一页/下一页按钮。 - 頁數在 2 以上時,會出現上一頁/下一頁按鈕。 - Prev/Next buttons will appear when there are more than 2 pages. + Prev/Next buttons will appear when there are more than 2 pages. + 分页数在2以上时,将会出现上一页/下一页按钮。 + 頁數在2以上時,會出現上一頁/下一頁按鈕。 + Prev/Next buttons will appear when there are more than 2 pages. Nút bấm "Trang trước/Trang sau" sẽ xuất hiện khi có từ 2 trang trở lên. ページ数が2枚以上の場合、前へ/次へのボタンが現れます。 @@ -633,13 +670,13 @@ Length of Subject can be assigned. (0 or blank value will not restrict the length) Có thể tăng thêm chiều dài của tiêu đề. (Đặt là 0 hoặc để trống nếu không giới hạn tiêu đề). El largo del título puede ser asignado. (valor 0 o en blanco no restringe el largo) - Длина темы может быть присвоена. (0 или пустое значение не будут ограничивать длину) + Длина темы может быть установлена. (0 или пустое значение не будут ограничивать длину) 可設置標題的字數。(0或留白為不限制) text 내용 글자수 - Content Length + Content Length Độ dài nội dung 内容の文字数 内容摘要字数 @@ -661,7 +698,7 @@ The target articles to be sorted will be the ones submitted in the selected module. Những bài viết sẽ được phân loại và hiển thị khi có bài mới gửi trong những Module đã chọn. El objetivo de los documentos agregados serán los del módulo selccionado. - Статьи назначения для сортировки будут теми, что были размещены в выбранном модуле. + Записи будут отсортированы в выбранном модуле 把所選擇的模組作為目標。 @@ -674,10 +711,14 @@ Feed(RSS/ATOM) URL Feed(RSS/ATOM) URL 피드 주소는 타입이 지원하는 문서 형식일 경우에만 등록 됩니다. + (지원 문서 형식 : RSS 2.0, RSS 1.0, ATOM 1.0) + Feed address will be registered only in case of required document type. (지원 문서 형식 : RSS 2.0, RSS 1.0, ATOM 1.0) 请输入RSS格式地址。 (支持文档格式 : RSS 2.0, RSS 1.0, ATOM 1.0) Chỉ hỗ trợ những định dạng được dăng kí. (RSS 2.0 RSS 1.0 ATOM 1.0). + Feed(RSS/ATOM) URL может быть зарегистрирован только в случае предлагаемом типе документа + (지원 문서 형식 : RSS 2.0, RSS 1.0, ATOM 1.0) RSS URLはタイプが RSSの時だけ登録出来ます。 (サポートする文書形式 : RSS 2.0, RSS 1.0, ATOM 1.0) 請輸入 RSS 位址。 @@ -730,14 +771,14 @@ HTML 출력 방식 HTML Display Type Hiển thị kiểu HTML - HTML 출력 방식 + Тип отображения HTML HTML 樣式選擇 TABLE(표)태그와 UL(목록형) 태그를 선택하여 출력하게 할 수 있습니다. (기본은 TABLE입니다) TABLE(表)タグとUL(リスト型)タグを選択して表示します。(デフォールトはTABLE) TABLE(표)태그와 UL(목록형) 태그를 선택하여 출력하게 할 수 있습니다. (기본은 TABLE입니다) You can choose TABLE tag or UL tag to display. (default is TABLE) Bạn có thể chọn Table Tag hay UL Tag để hiển thị. (Mặc định là Table) - TABLE(표)태그와 UL(목록형) 태그를 선택하여 출력하게 할 수 있습니다. (기본은 TABLE입니다) + You can choose TABLE tag or UL tag to display. (default is TABLE) 可選擇 TABLE(表格) 或 UL(列表) 樣式。(預設是 TABLE 樣式) table @@ -746,7 +787,7 @@ Table Table Table - Table + Таблица Table diff --git a/widgets/login_info/conf/info.xml b/widgets/login_info/conf/info.xml index 059361d04..253816030 100644 --- a/widgets/login_info/conf/info.xml +++ b/widgets/login_info/conf/info.xml @@ -6,7 +6,7 @@ Login Info Thông tin đăng nhập Muestra la información de la conección - Отображение информации логина + Отображение информации при входе на сайт 登入資料 로그인 폼이나 로그인 정보를 출력합니다 显示登陆表单或登陆信息。 @@ -14,7 +14,7 @@ This widget displays login form or login info. Widget này hiển thị bảng đăng nhập hay thông tin đăng kí. Este widget muestra la forma de la conección y la información de la conección. - Этот виджет отобратает форму логина или информацию. + Этот виджет отображает форму логина или информацию входа. 可顯示登入表格或登入資料。 0.1 2007-02-28