/*********************************************************************** * @filename : inc/common.js * @author : Ken Wang * @description : javascript * @created : 2006-02-20 * @modified : 2006-12-25 * @requires : inc/common.js ***********************************************************************/ /***** Detect Browser Capabilities *****/ var isDom = (document.getElementById) ? true:false; /***** Generic Functions *****/ /* string manipulation */ function trim( String ) { if ( String == null ) { return (false); } return String.replace( /(^\s+)|(\s+$)/g,"" ); } /* Emulate CGI Vars */ var cgi = new Object(); cgi.http_host = location.host; cgi.http_user_agent = navigator.userAgent; cgi.http_cookie = document.cookie; cgi.https = (location.protocol == 'https:\/\/') ? 'on' : 'off'; cgi.path_info = (location.pathname.indexOf('?') != -1) ? location.pathname.substring(0, location.pathname.indexOf('?')) : location.pathname; cgi.query_string = (location.search) ? ((location.search.indexOf('#') != -1) ? location.search.substring(1, location.search.indexOf('#')) : location.search.substring(1)) : ''; cgi.script_name = cgi.path_info; cgi.http_referer = document.referrer; /* jsCSS : mixed */ /* swap, add, remove, check http://www.onlinetools.org/articles/unobtrusivejavascript/cssjsseparation.html */ function jsCSS( action, obj, class1, class2 ) { switch( action ) { case 'swap': // i.e. toggle obj.className = !jsCSS('check',obj,class1) ? obj.className.replace( class2, class1 ) : obj.className.replace( class1, class2 ); break; case 'add': if( !jsCSS('check',obj,class1) ) { obj.className += obj.className ? ' '+class1 : class1; } break; case 'remove': var rep = obj.className.match(' '+class1) ? ' '+class1 : class1; obj.className = obj.className.replace( rep, '' ); break; case 'check': return new RegExp('\\b'+class1+'\\b').test(obj.className); break; } // end switch } // end jsCSS function findPosX(obj) { var curleft = 0; if (obj.offsetParent) { while (obj.offsetParent) { curleft += obj.offsetLeft; obj = obj.offsetParent; } } else if (obj.x) { curleft += obj.x; } return curleft; } function findPosY(obj) { var curtop = 0; if (obj.offsetParent) { while (obj.offsetParent) { curtop += obj.offsetTop; obj = obj.offsetParent; } } else if (obj.y) { curtop += obj.y; } return curtop; } /* Multiple Onloads */ /* usage: addLoadEvent( nameOfSomeFunctionToRunOnPageLoad ); addLoadEvent( function() { // more code to run on page load } ); */ function addLoadEvent(func) { var oldonload = window.onload; if ( typeof window.onload != 'function' ) { window.onload = func; } else { window.onload = function() { oldonload(); func(); } } } /* multiple onsubmits for
s */ function addOnSubmitEvent(formObj, func) { var oldonsubmit = formObj.onsubmit; if( typeof formObj.onsubmit != 'function' ) { formObj.onsubmit = func; } else { form.obj.onsubmit = function() { oldonsubmit(); func(); } } } /* popup window */ function popWin( url, winame, wintype, override_extras ) { if( typeof wintype != "string" ) { wintype = ""; } switch( wintype ) { case 'playMovie': extras = 'scrollbars=no,resizable=no,width=640,height=480,left=20,top=20,status=yes'; break; case 'doVote': extras = 'scrollbars=no,resizable=no,width=680,height=600,left=20,top=20,status=yes'; break; case 'doForward': extras = 'scrollbars=auto,resizable=yes,width=660,height=550,left=20,top=20,status=yes'; break; case 'showNote': extras = 'scrollbars=no,resizable=no,width=680,height=630,left=20,top=20,status=yes'; break; case 'playMusic': extras = 'scrollbars=no,resizable=no,width=240,height=100,status=yes'; break; case 'override': extras = override_extras; break; default: extras = 'scrollbars=yes,width=620,height=420,resizable=yes,status=yes'; } myPop = window.open( url, winame, extras ); myPop.focus(); } /* confirm action */ function confirmAction( url, msg ) { if( typeof msg != "string" ) { msg = "Are you sure you want to proceed?"; } if( confirm( msg ) ) { window.location = url; } } /***** Pagination *****/ function gotoPage( page_id, form_name ) { var formObj = document.forms[form_name]; formObj.page.value = page_id; formObj.submit(); } function orderPage( field, sort_dir, form_name ) { var formObj = document.forms[form_name]; formObj.sort_dir.value = sort_dir; formObj.sort_by.value = field; formObj.page.value = '1'; // always go back to page 1 upon sort/order formObj.submit(); } /***** pre-select a Select Obj *****/ function preSelectByVal( selObj, val ) { var selOptionsCount = selObj.options.length; for( var i=0; i max_len ) { return false; } switch( chktype ) { case 'email': return Validator.RE.email.test(str); break; case 'safe-ascii': // ascii chars except non-printing ones for( var i=0; i125 || str.charCodeAt(i)<32 ) return false; } break; case 'non-english': for( var i=0; i= min && num <= max ); break; case 'int': default: if( !(/^[0-9]+$/.test(num) ) ) { return false; } else { return ( num >= min && num <= max ); } break; } return true; } /***** Form Validation *****/ /* grabs values from the "required" hidden field */ Validator.genericFormChecker = function( formObj ) { if( !isDom ) { return true; } // no "required" field specified if( !formObj.required ) return true; var warnings = ""; // sample "required" field value="username,名字,3,24|gender,性別|city|email,E-mail,10,128,email" var req_fields_arr = formObj.required.value.split("|"); for( var i=0; i 1 ) { alert( "Please make sure the following fields are correct:\n" + warnings ); return false; } return confirm( "Are you sure you wish to proceed?" ); } /* attach form checkers according to the "name" attribute specified */ Validator.attachFormCheckers = function() { if( !isDom ) return; var formObjs = document.getElementsByTagName( "form" ); for( var i=0; i 200 ) { err[err.length] = "意見欄位限 200 個中文字,您已輸入了 " +formObj.notes.value.length+ " 字"; } // heard from radios if( typeof formObj.heard_from != 'undefined' && formObj.heard_from.length > 1 ) { var heard_from_selected = false; for( var i=0; i 0 ) { alert( "請修正下列欄位:\n\n- "+err.join("\n- ") ); return false; } // 轉寄功能 if( formObj.friend_name_1 && formObj.friend_email_1 ) { var friends = 0; for( var i=1; i<=5; i++ ) { if( !formObj['friend_name_'+i] ) continue; var fn = formObj['friend_name_'+i]; var fe = formObj['friend_email_'+i]; if( (fn.value!=fn.defaultValue && fn.value!='') && (fe.value!=fe.defaultValue && fe.value!='') ) { if( !Validator.checkString( fn.value, 1, 8, 'non-english' ) ) { err[err.length] = "好友姓名("+i+")"; } else if( !Validator.checkString( fe.value, 10, 100, 'email' ) ) { err[err.length] = "好友Email("+i+")"; } else { friends++; } } } if( err.length > 0 ) { alert( "請修正下列欄位:\n\n- "+err.join("\n- ") ); return false; } else if( friends == 0 ) { if( confirm("您未填寫好友推薦,請問要回到頁面填寫嗎?") ) { formObj['friend_name_1'].focus(); return false; } } } // all done, insert auto fields formObj.form_url.value = cgi.script_name; // clear all friend_name_* friend_email_* fields if == defaultValue if( formObj.friend_name_1 && formObj.friend_email_1 ) { for( var i=1; i<=5; i++ ) { var fn = formObj['friend_name_'+i]; var fe = formObj['friend_email_'+i]; if( fn.value == fn.defaultValue ) fn.value = ''; if( fe.value == fe.defaultValue ) fe.value = ''; } } return confirm( "確定要送出?" ); } /***** XML HTTP Requests (AJAX) *****/ var XHR = new Object(); XHR.constants = new Object(); XHR.constants.target = "xmlhttprequest.php"; XHR.requester = null; /* public boolean initialises XML-HTTP-Request */ XHR.init = function() { try { XHR.requester = new XMLHttpRequest(); } catch (error) { try { XHR.requester = new ActiveXObject("Microsoft.XMLHTTP"); } catch (error) { return false; } } return true; } /* public void stop running connections */ XHR.halt = function() { if( XHR.requester != null && XHR.requester.readState != 0 && XHR.requester.readyState != 4 ) { XHR.requester.abort(); } } function addFlashObj( s_src, i_width, i_height, a_params ) { var new_params = new Array(); var new_embed_params = new Array(); if( typeof a_params != "undefined" ) { for( var i=0; i'; new_embed_params[new_embed_params.length] = param_name+'="' +param_value+ '"'; } } var obj_html = ''+ ''+ new_params.join('') + ''+ ''; document.write( obj_html ); } // sample call: addMediaPlayerObj( 'some.mp3', 200, 100, ['autoStart|1',''], 'musicObj' ); // for more params: http://www.mioplanet.com/rsc/embed_mediaplayer.htm function addMediaPlayerObj( s_src, i_width, i_height, a_params, s_id ) { var new_params = new Array(); var new_embed_params = new Array(); if( typeof a_params != "undefined" ) { for( var i=0; i'; new_embed_params[new_embed_params.length] = param_name+'="' +param_value+ '"'; } } var obj_html = ''+ ''+ new_params.join('') + ''+ ''; document.write( obj_html ); } /***** Codes to run on body onload *****/ addLoadEvent( Validator.attachFormCheckers ); /***** City/Town/Zipcode Module *****/ City_Ary = new Array("臺北市", "基隆市", "臺北縣", "宜蘭縣", "新竹市", "新竹縣", "桃園縣", "苗栗縣", "臺中市", "臺中縣", "彰化縣", "南投縣", "嘉義市", "嘉義縣", "雲林縣", "臺南市", "臺南縣", "高雄市", "高雄縣", "澎湖縣", "屏東縣", "臺東縣", "花蓮縣", "金門縣", "連江縣"); Canton_Ary = new Array(25); //臺北市 Canton_Ary[0] = new Array("中正區","大同區","中山區","松山區","大安區","萬華區","信義區", "士林區","北投區","內湖區","南港區","文山區"); //基隆市 Canton_Ary[1] = new Array("仁愛區","信義區","中正區","中山區","安樂區","暖暖區","七堵區"); //臺北縣 Canton_Ary[2] = new Array("萬里鄉","金山鄉","板橋市","汐止鎮","深坑鄉","石碇鄉","瑞芳鎮", "平溪鄉","雙溪鄉","貢寮鄉","新店市","坪林鄉","烏來鄉","永和市", "中和市","土城市","三峽鎮","樹林市","鶯歌鎮","三重市","新莊市", "泰山鄉","林口鄉","蘆洲市","五股鄉","八里鄉","淡水鎮","三芝鄉", "石門鄉"); //宜蘭縣 Canton_Ary[3] = new Array("宜蘭市","頭城鎮","礁溪鄉","壯圍鄉","員山鄉","羅東鎮","三星鄉", "大同鄉","五結鄉","冬山鄉","蘇澳鎮","南澳鄉"); //新竹市 Canton_Ary[4] = new Array(""); //新竹縣 Canton_Ary[5] = new Array("竹北市","湖口鄉","新豐鄉","新埔鄉","關西鎮","芎林鄉","寶山鄉", "竹東鎮","五峰鄉","橫山鄉","尖石鄉","北埔鄉","峨嵋鄉"); //桃園縣 Canton_Ary[6] = new Array("中壢市","平鎮","龍潭鄉","楊梅鎮","新屋鄉","觀音鄉","桃園市", "龜山鄉","八德市","大溪鎮","復興鄉","大園鄉","蘆竹鄉"); //苗栗縣 Canton_Ary[7] = new Array("竹南鎮","頭份鎮","三灣鄉","南庄鄉","獅潭鄉","後龍鎮","通霄鎮", "苑裡鎮","苗栗市","造橋鄉","頭屋鄉","公館鄉","大湖鄉","泰安鄉", "鉰鑼鄉","三義鄉","西湖鄉","卓蘭鄉"); //臺中市 Canton_Ary[8] = new Array("中區","東區","南區","西區","北區","北屯區","西屯區","南屯區"); //臺中縣 Canton_Ary[9] = new Array("太平市","大里市","霧峰鄉","烏日鄉","豐原市","后里鄉","石岡鄉", "東勢鎮","和平鄉","新社鄉","潭子鄉","大雅鄉","神岡鄉","大肚鄉", "沙鹿鎮","龍井鄉","梧棲鎮","清水鎮","大甲鎮","外圃鄉","大安鄉"); //彰化縣 Canton_Ary[10] = new Array("彰化市","芬園鄉","花壇鄉","秀水鄉","鹿港鎮","福興鄉","線西鄉", "和美鎮","伸港鄉","員林鎮","社頭鄉","永靖鄉","埔心鄉","溪湖鎮", "大村鄉","埔鹽鄉","田中鎮","北斗鎮","田尾鄉","埤頭鄉","溪州鄉", "竹塘鄉","二林鎮","大城鄉","芳苑鄉","二水鄉"); //南投縣 Canton_Ary[11] = new Array("南投市","中寮鄉","草屯鎮","國姓鄉","埔里鎮","仁愛鄉","名間鄉", "集集鄉","水里鄉","魚池鄉","信義鄉","竹山鎮","鹿谷鄉"); //嘉義市 Canton_Ary[12] = new Array(""); //嘉義縣 Canton_Ary[13] = new Array("番路鄉","梅山鄉","竹崎鄉","阿里山鄉","中埔鄉","大埔鄉","水上鄉", "鹿草鄉","太保市","朴子市","東石鄉","六腳鄉","新港鄉","民雄鄉", "大林鎮","漢口鄉","義竹鄉","布袋鎮"); //雲林縣 Canton_Ary[14] = new Array("斗南市","大埤鄉","虎尾鎮","土庫鎮","褒忠鄉","東勢鄉","臺西鄉", "崙背鄉","麥寮鄉","斗六市","林內鄉","古坑鄉","莿桐鄉","西螺鎮", "二崙鄉","北港鎮","水林鄉","口湖鄉","四湖鄉","元長鄉"); //臺南市 Canton_Ary[15] = new Array("中區","東區","南區","西區","北區","安平區","安南區"); //臺南縣 Canton_Ary[16] = new Array("永康市","歸仁鄉","新化鎮","左鎮鄉","玉井鄉","楠西鄉","南化鄉", "仁德鄉","關廟鄉","龍崎鄉","官田鄉","麻豆鎮","佳里鎮","西港鄉", "七股鄉","將軍鄉","學甲鎮","北門鄉","新營市","後壁鄉","白河鎮", "東山鄉","六甲鄉","下營鄉","柳營鄉","鹽水鎮","善化鎮","大內鄉", "山上鄉","新市鄉","安定鄉"); //高雄市 Canton_Ary[17] = new Array("新興區","前金區","苓雅區","鹽埕區","鼓山區","旗津區","前鎮區", "三民區","楠梓區","小港區","左營區"); //高雄縣 Canton_Ary[18] = new Array("仁武鄉","大社鄉","岡山鎮","路竹鄉","阿蓮鄉","田寮鄉","燕巢鄉", "橋頭鄉","梓官鄉","彌陀鄉","永安鄉","湖內鄉","鳳山市","大寮鄉", "林園鄉","鳥松鄉","大樹鄉","旗山鎮","美濃鎮","六龜鄉","內門鄉", "杉林鄉","甲仙鄉","桃源鄉","三民鄉","茂林鄉","茄萣鄉"); //澎湖縣 Canton_Ary[19] = new Array("馬公市","西嶼鄉","望安鄉","七美鄉","白沙鄉","湖西鄉"); //屏東縣 Canton_Ary[20] = new Array("屏東市","三地門鄉","霧臺鄉","瑪家鄉","九如鄉","里港鄉","高樹鄉", "鹽埔鄉","長治鄉","麟洛鄉","竹田鄉","內埔鄉","萬丹鄉","潮州鎮", "泰武鄉","來義鄉","萬巒鄉","嵌頂鄉","新埤鄉","南州鄉","林邊鄉", "東港鎮","琉球鄉","佳冬鄉","新園鄉","枋寮鄉", "枋山鄉","春日鄉", "獅子鄉","車城鄉","牡丹鄉","恆春鎮","滿州鄉"); //臺東縣 Canton_Ary[21] = new Array("臺東市","綠島鄉","蘭嶼鄉","延平鄉","卑南鄉","鹿野鄉","關山鎮", "海端鄉","池上鄉","東河鄉","成功鎮","長濱鄉","太麻里鄉","金峰鄉", "大武鄉","達仁鄉"); //花蓮縣 Canton_Ary[22] = new Array("花蓮市","新城鄉","秀林鄉","吉安鄉","壽豐鄉","鳳林鎮","光復鄉", "豐濱鄉","瑞穗鄉","萬榮鄉","玉里鎮","卓溪鄉","富里鄉"); //金門縣 Canton_Ary[23] = new Array("金沙鎮","金湖鎮","金寧鄉","金城鎮","烈嶼鄉","烏坵鄉"); //連江縣 Canton_Ary[24] = new Array("南竿鄉","北竿鄉","莒光鄉","東引"); ZipCode_Ary = new Array(25); //臺北市 ZipCode_Ary[0] = new Array("100","103","104","105","106","108","110","111","112", "114","115","116"); //基隆市 ZipCode_Ary[1] = new Array("200","201","202","203","204","205","206"); //臺北縣 ZipCode_Ary[2] = new Array("207","208","220","221","222","223","224","226","227", "228","231","232","233","234","235","236","237","238", "239","241","242","243","244","247","248","249","251", "252","253"); //宜蘭縣 ZipCode_Ary[3] = new Array("260","261","262","263","264","265","266","267","268", "269","270","272"); //新竹市 ZipCode_Ary[4] = new Array("300"); //新竹縣 ZipCode_Ary[5] = new Array("302","303","304","305","306","307","308","310","311", "312","313","314","315"); //桃園縣 ZipCode_Ary[6] = new Array("320","324","325","326","327","328","330","333","334", "335","336","337","338"); //苗栗縣 ZipCode_Ary[7] = new Array("350","351","352","353","354","356","357","358","360", "361","362","363","364","365","366","367","368","369"); //臺中市 ZipCode_Ary[8] = new Array("400","401","402","403","404","406","407","408"); //臺中縣 ZipCode_Ary[9] = new Array("411","412","413","414","420","421","422","423","424", "426","427","428","429","432","433","434","435","436", "437","438","439"); //彰化縣 ZipCode_Ary[10] = new Array("500","502","503","504","505","506","507","508","509", "510","511","512","513","514","515","516","520","521", "522","523","524","525","526","527","528","530"); //南投縣 ZipCode_Ary[11] = new Array("540","541","542","544","545","546","551","552","553", "555","556","557","558"); //嘉義市 ZipCode_Ary[12] = new Array("600"); //嘉義縣 ZipCode_Ary[13] = new Array("602","603","604","605","606","607","608","611","612", "613","614","615","616","621","622","623","624","625"); //雲林縣 ZipCode_Ary[14] = new Array("630","631","632","633","634","635","636","637","638", "640","643","646","647","648","649","651","652","653", "654","655"); //臺南市 ZipCode_Ary[15] = new Array("700","701","702","703","704","708","709"); //臺南縣 ZipCode_Ary[16] = new Array("710","711","712","713","714","715","716","717","718", "719","720","721","722","723","724","725","726","727", "730","731","732","733","734","735","736","737","741", "742","743","744","745"); //高雄市 ZipCode_Ary[17] = new Array("800","801","802","803","804","805","806","807","811", "812","813"); //高雄縣 ZipCode_Ary[18] = new Array("814","815","820","821","822","823","824","825","826", "827","828","829","830","831","832","833","840","842", "843","844","845","846","847","848","849","851","852"); //澎湖縣 ZipCode_Ary[19] = new Array("880","881","882","883","884","885"); //屏東縣 ZipCode_Ary[20] = new Array("900","901","902","903","904","905","906","907","908", "909","911","912","913","920","921","922","923","924", "925","926","927","928","929","931","932","940","941", "942","943","944","945","946","947"); //臺東縣 ZipCode_Ary[21] = new Array("950","951","952","953","954","955","956","957","958", "959","961","962","963","964","965","966"); //花蓮縣 ZipCode_Ary[22] = new Array("970","971","972","973","974","975","976","977","978", "979","981","982","983"); //金門縣 ZipCode_Ary[23] = new Array("890","891","892","893","894","896"); //連江縣 ZipCode_Ary[24] = new Array("209","210","211","212"); function Init_City(CityInput) { CityInput.length = City_Ary.length; var inxdnumber = 0; for (i = 0; i < City_Ary.length; i++) { CityInput.options[i].value = City_Ary[i]; CityInput.options[i].text = City_Ary[i]; } CityInput.selectedIndex = inxdnumber; } function Change_Canton(CityInput, CantonInput, ZipcodeOutput) { selectedCountyIndex = CityInput.selectedIndex; CantonInput.length = Canton_Ary[selectedCountyIndex].length; for (i = 0; i < Canton_Ary[selectedCountyIndex].length; i++) { CantonInput.options[i].value = Canton_Ary[selectedCountyIndex][i]; CantonInput.options[i].text = Canton_Ary[selectedCountyIndex][i]; if (CantonInput.options[i].text == "") CantonInput.options[i].selected = true; } CantonInput.selectedIndex = 0; Output_ZipCode(CityInput, CantonInput, ZipcodeOutput); } function Output_ZipCode(CityInput, CantonInput, ZipcodeOutput) { ZipcodeOutput.value = ZipCode_Ary[CityInput.selectedIndex][CantonInput.selectedIndex]; } function Initiate(CityInput, CantonInput, ZipcodeOutput) { Init_City(CityInput); Change_Canton(CityInput, CantonInput, ZipcodeOutput); } function DefaultSelected(CityText,CantonText,CityInput,CantonInput,ZipcodeOutput){ var CityInputIndex,CantonInputIndex; for(i=0;i