/**
 * Functions that are used by javascript through the whole site...
 *
 * Using jSSc namespace / singleton pattern to avoid conflicts!!
 *
 * @version $Id: common.js 554 2008-11-17 19:15:28Z tomb $
 * @author Constantin I
 */
var jSSc = {
	
	
	/**
	 * This funcitons displays errors when needed...
	 */
	displayErrors : function () {
		// get browser info
		if (BrowserDetect.browser == 'Explorer' && Math.floor(BrowserDetect.version) < 7) {
			$('#ie6errors').css('display', 'block');
			//$('#rating_sys').css('display', 'none');	
		} else {
			$('#error_dialog').jqm();
			$('#error_dialog').jqmShow();
		}
		
	},
	
	/**
	 * JS equivalent of PHP's print_r
	 */
	print_r	: function(theObj) {
		
		output = this.getOutWrapper.reset();
		this._print_r(theObj, output);
		this.dumpIntoWindow(output.output());
		
	},
	
	/**
	 * equivalent to PHP print_r method... int means internal, as it
	 * doesn't know how to handle the return
	 */
	_print_r : function(theObj, output) {

		// initiate output string..
		if (output == null) {
			output = this.getOutWrapper.reset();
		}
		
		if (theObj.constructor == Array || theObj.constructor == Object || typeof(theObj) == 'object') {

			output.append('<ul>');
			
    		for (var p in theObj) {
      			//alert(typeof(theObj[p]));
      			
      			try {
      			
	    			if ((theObj[p].constructor == Array || theObj[p].constructor == Object)) {
						
	    				output.append('<li>[' + p + '] => ' + typeof(theObj) + '</li><ul>' );
	
	        			this._print_r(theObj[p], output);
	        			
	        			output.append('</ul>');
	     			
	    			} else {
						
	    				output.append('<li>[' + p + '] => ' + theObj[p] + '</li>');
	    				
	    				
	      			} 
      			} catch (ex) {}
    		}
    		
    		
    		output.append('</ul>');
		} 
    		
	},
	
	
	/**
	 * Helper wrapper for print_r
	 */
	getOutWrapper : {
		
		output_string : '',
		
		reset : function () {
			this.output_string = '';
			return this;
		},
		
		append : function (str) {
			this.output_string += str;
		},
		
		output : function () {
			return this.output_string;
		}
		
	},
	
	
	/**
	 * Sumps whatever we pass to it into a new window
	 */
	dumpIntoWindow : function (str) {
		

		var dump_window = window.open('', '', 'width=800,height=600,scrollbars=yes');
		dump_window.document.write(str);
		dump_window.document.write('<center><a href="#" onclick="window.close();">close</a></center>');
		dump_window.document.close();
		dump_window.focus();
	},
	
	
	/**
	 * Better javascript error handler.
	 */
	handleError : function (desc, page, line, chr) {
		
		// for the callback
		var param_obj = {
			line	:	line,
			file	:	page,
			message	:	desc
		};
				
		param_obj['message'] += "\n Browser: " + BrowserDetect.browser + ' ' + BrowserDetect.version;
		param_obj['message'] += "\n OS: " + BrowserDetect.OS;
		
		$.post('/webservices/jserror_log.service.php', param_obj);
		
	}
	
	
	
};


function base64_encode( data ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Tyler Akins (http://rumkin.com)
    // +   improved by: Bayron Guevara
    // +   improved by: Thunder.m
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)        
    // -    depends on: utf8_encode
    // *     example 1: base64_encode('Kevin van Zonneveld');
    // *     returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA=='
 
    // 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;
}

function utf8_encode ( string ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: sowberry
    // +    tweaked by: Jack
    // +   bugfixed by: Onno Marsman
    // +   improved by: Yves Sucaet
    // +   bugfixed by: Onno Marsman
    // *     example 1: utf8_encode('Kevin van Zonneveld');
    // *     returns 1: 'Kevin van Zonneveld'
 
    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;
}

// we want error to be handled "always"...
window.onerror = jSSc.handleError;