//Javascript Document
//Please include prototype.js before CALLING ANY OF THE BELOW FUNCTIONS
/******************* Filter Operators *****************************/
//Filter for typing characters in Input box 
var zip_field_filters = {'special':/[^A-Za-z0-9 ]/g}; //applicable for international post codes

var name_field_filters = {'special':/[^A-Za-z. ]/g};  //applicable for title,decrition, first and last name, subject etc.

var title_field_filters = {'special':/[^A-Za-z0-9.@-_ ]/g};  //applicable for title,decrition, first and last name, subject etc.

var phone_field_filters = {'special':/[^+0-9-() ]/g};  //applicable for title,decrition, first and last name, subject etc.

var email_field_filters = {'special':/[^A-Za-z0-9@._-]/g};  //applicable for emails only.

var number_field_filters = {'special':/[^0-9]/g};  //applicable fields which will only support numbers.

var decimal_field_filters = {'special':/[^0-9.]/g};  //applicable for fields which will only support decimals.

var filter_var = "";

var add_filters = function(type,o,w)
{
	if(type == 'email_filter'){
		filter_var = email_field_filters;
	}
	if(type == 'name_filter'){
		filter_var = name_field_filters;
	}
	if(type == 'zip_filter'){
		filter_var = zip_field_filters;
	}
	if(type == 'number_filter'){
		filter_var = number_field_filters;
	}
	if(type == 'decimal_filter'){
		filter_var = decimal_field_filters;
	}
	if(type == 'phone_filter'){
		filter_var = phone_field_filters;
	}
	if(type == 'title_filter'){
		filter_var = title_field_filters;
	}
	
	o.value = o.value.replace(filter_var[w],'');
	
}

var getCurrentYear = function(){
	var d = new Date();
	var curr_year = d.getFullYear();
	return curr_year;
}

var clear_field = function(ele){
	ele.value = '';
}


/**************************  FORM VALIDATORS **************************/
// Function to validate Html tags
var tagvalidate = function(val)
{
	return val.match(/([\<])([^\>]{1,})*([\>])/i);
}
//Email validator
var isEmail = function (email) {
	AtPos = email.indexOf("@")
	StopPos = email.lastIndexOf(".")
	Message = ""

	/*if (email == "") {
		return false;
	}*/

	if (AtPos == -1 || StopPos == -1) {
		return false;
	}

	if (StopPos < AtPos) {
		return false;
	}

	if (StopPos - AtPos == 1) {
		return false;
	}

	return true;
}
//URL validator
var isURL = function (theurl) {
     //string to match
     if (theurl.match(/^(http|https)\:\/\/\w+([\.\-]\w+)*\.\w{2,4}(\:\d+)*([\/\.\-\?\&\%\#]\w+)*\/?$/i))
     {
         return true;
     }
     else
     {
         return false; 
     }
}

// Function to clear all error messages
function clearErrorMsgs(className)
{
	var arrElements = document.getElementsByClassName(className);
	var arrLength = arrElements.length;
	var i;
	
	for( i = 0; i < arrLength; i++ )
	{
		arrElements[i].update();
	}
}



/*********************************** Text area operaters ****************************/

//One Function to Count and Limit Multiple Form Text Areas
function textCounter(field,cntfield,maxlimit) {
if (field.value.length > maxlimit) // if too long...trim it!
field.value = field.value.substring(0, maxlimit);
// otherwise, update 'characters left' counter
else
cntfield.value = maxlimit - field.value.length;
}


/*********************************** Checkbox Operators ******************************/

// Function to check whether any check box has been checked or not
var deleteItems = function (FormName)
{
	var frm = $(FormName);
	
	if( frm.chk.length > 0 )
	{
		for( var i = 0; i < frm.chk.length; i++ )
		{
			if( frm.chk[i].checked )
			{
				return confirm("Are you sure to Delete ?");
			}
		}
	}
	else
		if( frm.chk.checked )
		{
			return confirm("Are you sure to Delete ?");
		}
	
	alert("Please select at least one checkbox !");
	return false;
}

// Functions for checkboxes
var check_uncheck_slave = function (elem, form_name)
{
	var arr_chk_slave = $(form_name).chk;
	var arr_length = arr_chk_slave.length;
	var i;
	
	for( i = 0; i < arr_length; i++ )
	{
		arr_chk_slave[i].checked = elem.checked;
	}
}

var check_uncheck_master = function (elemID, form_name)
{
	var arr_chk_slave = $(form_name).chk;
	var arr_length = arr_chk_slave.length;
	var flag = true;
	var i;
	
	for( i = 0; i < arr_length; i++ )
	{
		if( !arr_chk_slave[i].checked )
		{
			flag = false;
			break;
		}
	}
	
	$(elemID).checked = flag;
}

/************************************  Age Calculater ***********************************/
///***** SAMPLE USAGE ***************///////
//displayage (year, month, day, unit, decimals, rounding)
//Unit can be "years", "months", or "days"
//Decimals specifies demical places to round to (ie: 2)
//Rounding can be "roundup" or "rounddown"

//displayage(1997, 11, 24, "years", 0, "rounddown")

var one_day=1000*60*60*24
var one_month=1000*60*60*24*30
var one_year=1000*60*60*24*30*12

var displayage = function (yr, mon, day, unit, decimal, round){
	today=new Date()
	var pastdate=new Date(yr, mon-1, day)
	var countunit=unit
	var decimals=decimal
	var rounding=round
	finalunit=(countunit=="days")? one_day : (countunit=="months")? one_month : one_year
	decimals=(decimals<=0)? 1 : decimals*10
	if (unit!="years"){
		if (rounding=="rounddown")
		document.write(Math.floor((today.getTime()-pastdate.getTime())/(finalunit)*decimals)/decimals+" "+countunit)
		else
		document.write(Math.ceil((today.getTime()-pastdate.getTime())/(finalunit)*decimals)/decimals+" "+countunit)
	}
	else{
		yearspast=today.getFullYear()-yr-1
		tail=(today.getMonth()>mon-1 || today.getMonth()==mon-1 && today.getDate()>=day)? 1 : 0
		pastdate.setFullYear(today.getFullYear())
		pastdate2=new Date(today.getFullYear()-1, mon-1, day)
		tail=(tail==1)? tail+Math.floor((today.getTime()-pastdate.getTime())/(finalunit)*decimals)/decimals : Math.floor((today.getTime()-pastdate2.getTime())/(finalunit)*decimals)/decimals
		document.write(yearspast+tail+" "+countunit)
	}
}



/************************************  PWC Operators *************************************/
//Opening a Ajax based modal window
var create_modal = function(page, width, height, bool_val)
{
	var pwc_modal;
	if( bool_val )
	{
		pwc_modal = Dialog.info( {
						url: page, 
						options: {
							method: 'post'
						}
					 }, {
						 className: "alphacube", 
						 width:width, 
						 height:height, 
						 showEffect: Effect.Appear, 
						 hideEffect: Effect.Fade, 
						 showProgress: false
					 });
	}
	else
	{
		Dialog.closeInfo();
	}
}

var load_list = function(encoded_url,ajax_params,container,pagidiv){
	$(container).update("<div align='center'><img src='images/ajax-loader.gif' alt='Please wait' width='32' height='32' /></div>");
	var debug = false;
	//alert(encoded_url);
	var url = base64_decode(encoded_url);
	//alert(url);
	var splitted_url = url.split("?");
	var requester = splitted_url[0];
	var extras = splitted_url[1];
	var params = ajax_params+"&"+extras;
	//alert(params);
	new Ajax.Request(url, {
					 	method : 'get',
						parameters : params,
						onComplete : function(transport){
							//alert(transport.responseText);
							$(container).update(transport.responseText);
							
						}
					 });
}

var create_modal_list = function(page, width, height, bool_val, encoded_url, ajax_params, container)
{
	var pwc_modal;
	if( bool_val )
	{
		pwc_modal = Dialog.info( {
						url: page, 
						options: {
							method: 'post'
						}
					 }, {
						 className: "alphacube", 
						 width:width, 
						 height:height, 
						 showEffect: Effect.Appear, 
						 hideEffect: Effect.Fade, 
						 showProgress: false,
						 onShow : function(){
							 load_list(encoded_url,ajax_params,container,'');
						 }
					 });
	}
	else
	{
		Dialog.closeInfo();
	}
}

/*********************************  Genral Ajax Updaters ***************/

var load_html = function(container,ajax_url){
	url = base64_decode(ajax_url);
	$(container).update("<div align='center'><img src='images/ajax-loader.gif' alt='Please wait' width='32' height='32' /></div>")
	new Ajax.Updater(container, url, {
		method : 'get',
		onFailure : function(transport){
			alert(transport.responseText);
		}
	});
}


var load_dhtml = function(container,ajax_url,params){
	var url = base64_decode(ajax_url);
	var params = base64_decode(params);
	//alert(container);
	$(container).update("<div align='center'><img src='images/ajax-loader.gif' alt='Please wait' width='32' height='32' /></div>")
	new Ajax.Updater(container, url, {
		method : 'get',
		parameters : params,
		onSuccess : function(transport){
			//alert(transport.responseText);
		},
		onFailure : function(transport){
			alert(transport.responseText);
		}
	});
}



/**********************************  Miscelleneous Functions ************************/

// Function to convert date & time to timestamp
var toTimestamp = function(year, month, day, hour, minute, second)
{
	var datum = new Date(Date.UTC(year, month - 1, day, hour, minute, second));
	return datum.getTime()/1000;
}
// Function to hide/show an element
var hide_show = function(toBeHide, toBeShhown)
{
	$(toBeHide).hide();
	$(toBeShhown).show();
}


function exit (status) {
    // !No description available for exit. @php.js developers: Please update the function summary text file.
    // 
    // version: 909.322
    // discuss at: http://phpjs.org/functions/exit    // +   original by: Brett Zamir (http://brett-zamir.me)
    // +      input by: Paul
    // +   bugfixed by: Hyam Singer (http://www.impact-computing.com/)
    // +   improved by: Philip Peterson
    // +   bugfixed by: Brett Zamir (http://brett-zamir.me)    // %        note 1: Should be considered expirimental. Please comment on this function.
    // *     example 1: exit();
    // *     returns 1: null
    var i;
     if (typeof status === 'string') {
        alert(status);
    }
 
    this.window.addEventListener('error', function (e) {e.preventDefault();e.stopPropagation();}, false); 
    var handlers = [
        'copy', 'cut', 'paste',
        'beforeunload', 'blur', 'change', 'click', 'contextmenu', 'dblclick', 'focus', 'keydown', 'keypress', 'keyup', 'mousedown', 'mousemove', 'mouseout', 'mouseover', 'mouseup', 'resize', 'scroll',
        'DOMNodeInserted', 'DOMNodeRemoved', 'DOMNodeRemovedFromDocument', 'DOMNodeInsertedIntoDocument', 'DOMAttrModified', 'DOMCharacterDataModified', 'DOMElementNameChanged', 'DOMAttributeNameChanged', 'DOMActivate', 'DOMFocusIn', 'DOMFocusOut', 'online', 'offline', 'textInput',        'abort', 'close', 'dragdrop', 'load', 'paint', 'reset', 'select', 'submit', 'unload'
    ];
    
    function stopPropagation (e) {
        e.stopPropagation();        // e.preventDefault(); // Stop for the form controls, etc., too?
    }
    for (i=0; i < handlers.length; i++) {
        this.window.addEventListener(handlers[i], function (e) {stopPropagation(e);}, true);
    } 
    if (this.window.stop) {
        this.window.stop();
    }
        throw '';
}



/*************************** ENCODERS AND DECODERS *********************************/

//URL encode and decode
var urlencode = function  (str) {
    // URL-encodes string  
    // %          note 1: This reflects PHP 5.3/6.0+ behavior
    // *     example 1: urlencode('Kevin van Zonneveld!');
    // *     returns 1: 'Kevin+van+Zonneveld%21'
    // *     example 2: urlencode('http://kevin.vanzonneveld.net/');
    // *     returns 2: 'http%3A%2F%2Fkevin.vanzonneveld.net%2F'
    // *     example 3: urlencode('http://www.google.nl/search?q=php.js&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:unofficial&client=firefox-a');
    // *     returns 3: 'http%3A%2F%2Fwww.google.nl%2Fsearch%3Fq%3Dphp.js%26ie%3Dutf-8%26oe%3Dutf-8%26aq%3Dt%26rls%3Dcom.ubuntu%3Aen-US%3Aunofficial%26client%3Dfirefox-a'
    var hexStr = function (dec) {
        return '%' + (dec < 16 ? '0' : '') + dec.toString(16).toUpperCase();
    };

    var ret = '',

            unreserved = /[\w.-]/; // A-Za-z0-9_.- // Tilde is not here for historical reasons; to preserve it, use rawurlencode instead
    str = (str+'').toString();

    for (var i = 0, dl = str.length; i < dl; i++) {
        var ch = str.charAt(i);
        if (unreserved.test(ch)) {
            ret += ch;
        }
        else {
            var code = str.charCodeAt(i);
            if (0xD800 <= code && code <= 0xDBFF) { // High surrogate (could change last hex to 0xDB7F to treat high private surrogates as single characters); https://developer.mozilla.org/index.php?title=en/Core_JavaScript_1.5_Reference/Global_Objects/String/charCodeAt
                ret += ((code - 0xD800) * 0x400) + (str.charCodeAt(i+1) - 0xDC00) + 0x10000;
                i++; // skip the next one as we just retrieved it as a low surrogate
            }
            // We never come across a low surrogate because we skip them, unless invalid
            // Reserved assumed to be in UTF-8, as in PHP
            else if (code === 32) {
                ret += '+'; // %20 in rawurlencode
            }
            else if (code < 128) { // 1 byte
                ret += hexStr(code);
            }
            else if (code >= 128 && code < 2048) { // 2 bytes
                ret += hexStr((code >> 6) | 0xC0);
                ret += hexStr((code & 0x3F) | 0x80);
            }
            else if (code >= 2048) { // 3 bytes (code < 65536)
                ret += hexStr((code >> 12) | 0xE0);
                ret += hexStr(((code >> 6) & 0x3F) | 0x80);
                ret += hexStr((code & 0x3F) | 0x80);
            }
        }
    }
    return ret;
}

var urldecode = function  (str) {
    // Decodes URL-encoded string  
    // %        note 1: info on what encoding functions to use from: http://xkr.us/articles/javascript/encode-compare/
    // *     example 1: urldecode('Kevin+van+Zonneveld%21');
    // *     returns 1: 'Kevin van Zonneveld!'
    // *     example 2: urldecode('http%3A%2F%2Fkevin.vanzonneveld.net%2F');
    // *     returns 2: 'http://kevin.vanzonneveld.net/'
    // *     example 3: urldecode('http%3A%2F%2Fwww.google.nl%2Fsearch%3Fq%3Dphp.js%26ie%3Dutf-8%26oe%3Dutf-8%26aq%3Dt%26rls%3Dcom.ubuntu%3Aen-US%3Aunofficial%26client%3Dfirefox-a');
    // *     returns 3: 'http://www.google.nl/search?q=php.js&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:unofficial&client=firefox-a'
    
    var hash_map = {}, ret = str.toString(), unicodeStr='', hexEscStr='';
    
    var replacer = function (search, replace, str) {
        var tmp_arr = [];
        tmp_arr = str.split(search);
        return tmp_arr.join(replace);
    };
    
    // The hash_map is identical to the one in urlencode.
    hash_map["'"]   = '%27';
    hash_map['(']   = '%28';
    hash_map[')']   = '%29';
    hash_map['*']   = '%2A';
    hash_map['~']   = '%7E';
    hash_map['!']   = '%21';
    hash_map['%20'] = '+';
    hash_map['\u00DC'] = '%DC';
    hash_map['\u00FC'] = '%FC';
    hash_map['\u00C4'] = '%D4';
    hash_map['\u00E4'] = '%E4';
    hash_map['\u00D6'] = '%D6';
    hash_map['\u00F6'] = '%F6';
    hash_map['\u00DF'] = '%DF';
    hash_map['\u20AC'] = '%80';
    hash_map['\u0081'] = '%81';
    hash_map['\u201A'] = '%82';
    hash_map['\u0192'] = '%83';
    hash_map['\u201E'] = '%84';
    hash_map['\u2026'] = '%85';
    hash_map['\u2020'] = '%86';
    hash_map['\u2021'] = '%87';
    hash_map['\u02C6'] = '%88';
    hash_map['\u2030'] = '%89';
    hash_map['\u0160'] = '%8A';
    hash_map['\u2039'] = '%8B';
    hash_map['\u0152'] = '%8C';
    hash_map['\u008D'] = '%8D';
    hash_map['\u017D'] = '%8E';
    hash_map['\u008F'] = '%8F';
    hash_map['\u0090'] = '%90';
    hash_map['\u2018'] = '%91';
    hash_map['\u2019'] = '%92';
    hash_map['\u201C'] = '%93';
    hash_map['\u201D'] = '%94';
    hash_map['\u2022'] = '%95';
    hash_map['\u2013'] = '%96';
    hash_map['\u2014'] = '%97';
    hash_map['\u02DC'] = '%98';
    hash_map['\u2122'] = '%99';
    hash_map['\u0161'] = '%9A';
    hash_map['\u203A'] = '%9B';
    hash_map['\u0153'] = '%9C';
    hash_map['\u009D'] = '%9D';
    hash_map['\u017E'] = '%9E';
    hash_map['\u0178'] = '%9F';
    hash_map['\u00C6'] = '%C3%86';
    hash_map['\u00D8'] = '%C3%98';
    hash_map['\u00C5'] = '%C3%85';

    for (unicodeStr in hash_map) {
        hexEscStr = hash_map[unicodeStr]; // Switch order when decoding
        ret = replacer(hexEscStr, unicodeStr, ret); // Custom replace. No regexing
    }
    
    // End with decodeURIComponent, which most resembles PHP's encoding functions
    ret = decodeURIComponent(ret);

    return ret;
}
//UTF8 ENCODE/DECODE
var utf8_encode = function  ( string ) {
    
 
    string = (string+'').replace(/\r\n/g, "\n").replace(/\r/g, "\n");
 
    var utftext = "";
    var start, end;
    var stringl = 0;
 
    start = end = 0;
    stringl = string.length;
    for (var n = 0; n < stringl; n++) {
        var c1 = string.charCodeAt(n);
        var enc = null;
 
        if (c1 < 128) {
            end++;
        } else if((c1 > 127) && (c1 < 2048)) {
            enc = String.fromCharCode((c1 >> 6) | 192) + String.fromCharCode((c1 & 63) | 128);
        } else {
            enc = String.fromCharCode((c1 >> 12) | 224) + String.fromCharCode(((c1 >> 6) & 63) | 128) + String.fromCharCode((c1 & 63) | 128);
        }
        if (enc != null) {
            if (end > start) {
                utftext += string.substring(start, end);
            }
            utftext += enc;
            start = end = n+1;
        }
    }
 
    if (end > start) {
        utftext += string.substring(start, string.length);
    }
 
    return utftext;
}

var utf8_decode = function  ( str_data ) {
    // Converts a UTF-8 encoded string to ISO-8859-1  
    // 
    // version: 909.322
    // discuss at: http://phpjs.org/functions/utf8_decode
    // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
    // +      input by: Aman Gupta
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Norman "zEh" Fuchs
    // +   bugfixed by: hitwork
    // +   bugfixed by: Onno Marsman
    // +      input by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: utf8_decode('Kevin van Zonneveld');
    // *     returns 1: 'Kevin van Zonneveld'
    var tmp_arr = [], i = 0, ac = 0, c1 = 0, c2 = 0, c3 = 0;
    
    str_data += '';
    
    while ( i < str_data.length ) {
        c1 = str_data.charCodeAt(i);
        if (c1 < 128) {
            tmp_arr[ac++] = String.fromCharCode(c1);
            i++;
        } else if ((c1 > 191) && (c1 < 224)) {
            c2 = str_data.charCodeAt(i+1);
            tmp_arr[ac++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
            i += 2;
        } else {
            c2 = str_data.charCodeAt(i+1);
            c3 = str_data.charCodeAt(i+2);
            tmp_arr[ac++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
            i += 3;
        }
    }

    return tmp_arr.join('');
}


//BASE64 ENCODE/DECODE
var base64_encode = function ( data ) {
    // Encodes data with MIME base64
    // mozilla has this native
    // - but breaks in 2.0.0.12!
    //if (typeof window['atob'] == 'function') {
    //    return atob(data);
    //}
        
    var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var o1, o2, o3, h1, h2, h3, h4, bits, i = ac = 0, enc="", tmp_arr = [];
    data = utf8_encode(data);
    
    do { // pack three octets into four hexets
        o1 = data.charCodeAt(i++);
        o2 = data.charCodeAt(i++);
        o3 = data.charCodeAt(i++);

        bits = o1<<16 | o2<<8 | o3;

        h1 = bits>>18 & 0x3f;
        h2 = bits>>12 & 0x3f;
        h3 = bits>>6 & 0x3f;
        h4 = bits & 0x3f;

        // use hexets to index into b64, and append result to encoded string
        tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
    } while (i < data.length);
    
    enc = tmp_arr.join('');
    
    switch( data.length % 3 ){
        case 1:
            enc = enc.slice(0, -2) + '==';
        break;
        case 2:
            enc = enc.slice(0, -1) + '=';
        break;
    }

    return enc;
}

var base64_decode = function ( data ) {
    // Decodes data encoded with MIME base64
    // mozilla has this native
    // - but breaks in 2.0.0.12!
    //if (typeof window['btoa'] == 'function') {
    //    return btoa(data);
    //}

    var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var o1, o2, o3, h1, h2, h3, h4, bits, i = ac = 0, dec = "", tmp_arr = [];

    data += '';

    do {  // unpack four hexets into three octets using index points in b64
        h1 = b64.indexOf(data.charAt(i++));
        h2 = b64.indexOf(data.charAt(i++));
        h3 = b64.indexOf(data.charAt(i++));
        h4 = b64.indexOf(data.charAt(i++));

        bits = h1<<18 | h2<<12 | h3<<6 | h4;

        o1 = bits>>16 & 0xff;
        o2 = bits>>8 & 0xff;
        o3 = bits & 0xff;

        if (h3 == 64) {
            tmp_arr[ac++] = String.fromCharCode(o1);
        } else if (h4 == 64) {
            tmp_arr[ac++] = String.fromCharCode(o1, o2);
        } else {
            tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);
        }
    } while (i < data.length);

    dec = tmp_arr.join('');
    dec = utf8_decode(dec);

    return dec;
}


