
function addEvent(obj, evType, fn) 
{
	if (obj.addEventListener) {
		obj.addEventListener(evType, fn, true);
		return true;
	} else if (obj.attachEvent) {
		var r = obj.attachEvent("on"+evType, fn);
		return r;
	} else {
		return false;
	}
}


function createElement(element) 
{
	if (typeof document.createElementNS != 'undefined') {
		return document.createElementNS('http://www.w3.org/1999/xhtml', element);
	}
	if (typeof document.createElement != 'undefined') {
		return document.createElement(element);
	}
	return false;
}

/** -----------------------------------------------------------------------------------------
* Toggles an element's visibility.
* @param {id} targetId - the id of the element to be toggled.
----------------------------------------------------------------------------------------- */
function toggle (targetId) 
{
	if (document.getElementById) 
	{
		var target = document.getElementById(targetId);
		
		if (target.style.display == "none") {
			target.style.display = "block";
		} else {
			target.style.display = "none";
		}
	}	
}

/** -----------------------------------------------------------------------------------------
* Makes an element visibile.
* @param {id} targetId - the id of the element to be displayed.
----------------------------------------------------------------------------------------- */
function show (targetId) 
{
	if (document.getElementById) {
		var target = document.getElementById(targetId);
			
		if (target.style.display == "none") {
				target.style.display = "block";
		} else return false;
	}	
}


/** -----------------------------------------------------------------------------------------
* Hides an element.
* @param {id} targetId - the id of the element to be hidden.
----------------------------------------------------------------------------------------- */
function hide (targetId) 
{
	if (document.getElementById) {
		var target = document.getElementById(targetId);
		
		if ( (target.style.display == "block") || (target.style.display == "") ) {
				target.style.display = "none";
		} 			
	}	
}

/**
 * Adds target attribute to open links with rel="external" in a new window.
 * -------------------------------------------------------------------------- */
function externalLinks() 
{
	if (!document.getElementsByTagName) return;
	
	var anchors = document.getElementsByTagName("a");
	
	for (var i=0; i<anchors.length; i++) 
	{
		var anchor = anchors[i];
		if (anchor.getAttribute("href") && 	anchor.getAttribute("rel") == "external") {
			anchor.title = "opens in a new window";
			anchor.target = "_blank";	
		}		
	}
}


/**
 * Removes the rectangle that appears around links in Firefox.
 * -------------------------------------------------------------------------- */
function removeRectangle () 
{
    var lnks = document.links;
    if (!lnks) { return false; }
	
	var lg = lnks.length;
	
	for (var i = 0; i < lg; i++) 
	{
		lnks[i].onmousedown = function() 
		{
			this.blur();
			return false;
		};
	}
}


/**
 * Adds a javascript file link to the head of the page.
 * -------------------------------------------------------------------------- */
function include_dom(script_filename) 
{
    if (typeof document.getElementsByTagName == 'undefined') { return false; }
	
	var html_doc = document.getElementsByTagName('head').item(0);
    var js = document.createElement('script');
    js.setAttribute('language', 'javascript');
    js.setAttribute('type', 'text/javascript');
    js.setAttribute('src', script_filename);
    html_doc.appendChild(js);
    return false;
}

included_files = new Array();

/**
 * Adds/Includes a javascript file "once"
 * @see {in_array, include_dom}
 * @param {String} script_filename
 * -------------------------------------------------------------------------- */
function include_once(script_filename) 
{
    if (!in_array(script_filename, included_files)) 
	{
        included_files[included_files.length] = script_filename;
        include_dom(script_filename);
    }
}

/**
 * @param {Object} needle
 * @param {Object} haystack
 * @return {Boolean}
 * -------------------------------------------------------------------------- */
function in_array(needle, haystack) 
{
    for (var i = 0; i < haystack.length; i++) 
	{
        if (haystack[i] == needle) { return true; }
    }
    return false;
}

function getElementsByClass (searchClass, node, tag) 
{
	var classElements = new Array();
	
	if ( node == null ) { node = document; }
	if ( tag == null ) { tag = '*'; }
		
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
	
	for (i = 0, j = 0; i < elsLen; i++) 
	{
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}

function prepareGallery () 
{
    var content = document.getElementById("content-main");
    var lists = getElementsByClass ('gallery', content, 'ul');
    
    if (typeof content == 'undefined' ) { return false; }
    if (typeof content == 'lists' ) { return false; }
		
    if (lists.length != 0) {
		var js_path = 'assets/js/';
		include_once(js_path + 'lightwindow.js');
	}
}

/**
 * Loads a new freecap image
 */
function captchaLoadNew ()
{
	
	if (!document.getElementById) { return false; }
	
	current_img = document.getElementById("captcha-img");
	thesrc = current_img.src;
	thesrc = thesrc.substring(0,thesrc.lastIndexOf(".")+4);
	
	var imgWidth  = current_img.width;
	var imgHeight = current_img.height;
	
	var wrap = document.getElementById("captcha-wrap");
	wrap.style.width   = imgWidth+'px';
	wrap.style.height  = imgHeight+'px';
	wrap.style.display = 'block';
	wrap.style.textAlign = 'center';	
	loading_img = new Image();
	loading_img.src = 'http://'+window.location.hostname+'/assets/images/loading.gif';
	target_img = new Image();
    target_img.src = thesrc+"?"+Math.round(Math.random()*100000);
	
	current_img.src = loading_img.src;
	
	current_img.style.marginTop = '20px'; 
	timer_id = ''; 
	captchaReplaceImg();
}

function captchaReplaceImg ()
{		
	if (!imgLoaded(target_img) )
	{	
		if (timer_id == '') {
			timer_id = window.setInterval("captchaReplaceImg()", 500);
		}
	} else {
		current_img.style.marginTop = '0px';
		current_img.src = target_img.src;		
		
		if (timer_id != '') {
			clearInterval(timer_id);			
		}
	}
}

function imgLoaded(img)
{
    // IE only
    if (!img.complete) {
		return false;
	}

    // Other browsers
    if (typeof img.naturalWidth != "undefined" && img.naturalWidth == 0) {
		return false;
	}

    return true;
}

/**
 * Replaces the captcha reload text/description with a trigger link.
 */
function captchaAddTrigger () 
{
	if (!document.getElementById) return false;
	
	var txt_elm = document.getElementById('captcha-reload');
	var txt_elm_id = 'captcha-reload';
	var txt = "If you cannot read the word, you can load a <a href=\"#\" onClick=\"this.blur();captchaLoadNew();return false;\" title=\"Load new word\">new one</a>.";
	
	if (txt_elm) {
		txt_elm.innerHTML = txt;
	}
}


/** ----------------------------------------------------------------------------
* Obfuscates provided string.
* @param {string} text text to be obfuscated.
* @return {string}
---------------------------------------------------------------------------- */
function obfuscate (text)
{
    var obfuscated = '';

    for (i = 0; i < text.length; i++) {
		obfuscated += "&#" + text.charCodeAt(i);
	}
	return (obfuscated);
}

/** ----------------------------------------------------------------------------
* Writes the obfuscated mailto link to the page.
* @param {string} mailbox - Mailbox user name.
* @param {String} link_text - with the link text.
* @return {html mailto link}
---------------------------------------------------------------------------- */
function show_address (mailbox, link_text)
{
	if (mailbox == '') {
		mailbox = 'info';
	}

	var domain_name	= 'starview-villas.com';
	var email	 	= mailbox + '@' + domain_name;
	var email_obf 	= obfuscate (email);

	// use the link_text provided or the address if it's not.
	if (link_text != '') 
	{
		var link_text_obf = obfuscate (link_text);
	}
	else 
	{
		var link_text_obf = email_obf;
	}
	document.write('<a href="mailto:' + email_obf + '" title="start your email client to send message to this address">' + link_text_obf + '</a>');
}

function tableRuler()
{
    if (!document.getElementById || !document.getElementsByTagName) { return false; }
	
    var tables = document.getElementsByTagName ('table');

    for (var i=0;i<tables.length;i++)
    {
        if (tables[i].className.match("ruler"))
        { 
			var trs = tables[i].getElementsByTagName('tr');
            for (var j=0; j<trs.length; j++)
            {
                if (trs[j].parentNode.nodeName == 'TBODY' && trs[j].parentNode.nodeName != 'TFOOT')
                {
					trs[j].onmouseover = function() { original_class = this.className; this.className='ruled'; return false }
                    trs[j].onmouseout = function() { this.className = original_class; return false }
                }
            }
        }
    }
}

function formDisplay ()
{
	if (!document.getElementById) { return false; }
	
	/*
	a) hide the reservation fields on load, so that javascript disabled browsers can see them
	b) keep showing them if the "reservations" option is checked and the page is reloaded.
	*/
	
	var container 	= document.getElementById('reservations');
	var form 		= document.getElementById('contact'); 
	
	
	if (!container || !form)
	{
		return false;
	}
	
	var element 	= form.request[1]; //use form id for xhtml strict validation
	
	if (element.checked == true) {
			container.style.display = "block";
			return false;
	} else {
			container.style.display = "none";
	}
}

// -- set global variables -- //
DIR_ICONS_URI	= '/assets/icons/';
DIR_JS_URI		= '/assets/js/';
DIR_PHP_URI 	= '/cms/assets/scripts/php/';

// -- inlcude global scripts -- //
include_once(DIR_JS_URI + 'common.js');
//include_once(DIR_JS_URI + 'dialog.js');
//include_once(DIR_JS_URI + 'locations.js');

if(document.getElementById)
{
	addEvent(window, 'load', externalLinks);
	addEvent(window, 'load', removeRectangle);
	addEvent(window, 'load', formDisplay);
	addEvent(window, 'load', tableRuler);
}
